I was reading an old post where Hal Daume III was analyzing Haskell performance for arrays. <br>He proposed a test program which initializes an array, reverse it a number of times, and sums the contents.<br><br>So I wrote a c++ reference program, a naive haskell version using lists and I also tweaked a little bit with the IOArray version, which should be the fastest. Unfortunately there is a huge performance gap. Haskell is slower by a factor of ten, even when using imperative style.
<br><br>C++ <br>time ./arrayC<br>
499<br>
real 0m0.059s<br>
user 0m0.044s<br>
sys 0m0.008s<br>
<br>
HASKELL - IOUArray<br>
time ./IOMutArrayUnboxed<br>
499<br>
real 0m0.720s<br>
user 0m0.571s<br>
sys 0m0.019s<br><br>HASKELL - list<br>
time ./list<br>
499<br>
real 0m1.845s<br>
user 0m1.770s<br>
sys 0m0.064s<br>
<br><br>Can anyone suggest a faster version (using whatever data structure)? I like Haskell very much but I still have to figure out if the slowness of some code is due to my lack of knowledge or to some intrinsic limitation of the language (or libraries).
<br><br>By the way, sorry for the poor quality of the code, I am not a computer scientist.<br><br><br>-------------------------------------------------------------------------------------------------------------------------------
<br>-------------------------------------------------------------------------------------------------------------------------------<br>//compile with <br>//g++ -o arrayC arrayC.cc <br>#include <stdio.h><br>#include <
math.h><br><br><br><br>int main()<br>{<br> int array[500001];<br> <br> for (int i=0;i<=500000;i++)<br> {<br> array[i]=(19*i+23)%911;<br> }<br> int tmp=0;<br> for (int cnt=0;cnt<12;cnt++)<br> {<br>
for (int x=0;x<=250000;x++)<br> {<br> tmp=array[500000-x];<br> array[500000-x]=array[x];<br> array[x]=tmp;<br> }<br> }<br> int result=0;<br> for (int i=0;i<=500000;i++)
<br> {<br> result=result+(array[i]%911);<br> }<br> result=result % 911;<br> printf("%d",result); <br> return 0;<br>}<br><br>---------------------------------------------------------------------------------------------
<br>---------------------------------------------------------------------------------------------<br>-- compile with<br>-- ghc --make -o list list.hs<br>module Main<br> where<br><br>testArray = [ (19*i+23) `mod` 911 |i <- [0..500000]]
<br><br>sumArrayMod = foldl (\x y -> (y+x) `mod` 911) 0<br><br>main = print $ sumArrayMod$<br> reverse$ reverse$ reverse$ reverse$<br> reverse$ reverse$ reverse$ reverse$<br> reverse$ reverse$ reverse$ reverse$
<br> reverse$ reverse$ reverse$ reverse$<br> testArray<br><br><br>---------------------------------------------------------------------------------------------
<br>---------------------------------------------------------------------------------------------<br>-- compile with<br>-- ghc --make -o IOMutArrayUnboxed IOMutArrayUnboxed.hs<br>module Main<br> where<br><br>import Monad
<br>import <a href="http://Data.Array.IO" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">Data.Array.IO</a><br>import Data.Array.MArray<br>import Data.Array.Unboxed<br><br>total, semiTotal ::Int<br>
total= 500000<br>semiTotal=250000<br><br><br>testArray :: IO (IOUArray Int Int)
<br>testArray = newListArray (0,total) [(19*i+23) `mod` 911 |i <- [0..total]]<br><br><br>reverseArray :: IOUArray Int Int -> IO ()<br>reverseArray arr = mapM_ (\i -> do oldi <- readArray arr i<br> oldj <- readArray arr (total-i)
<br> writeArray arr i oldj<br> writeArray arr (total-i) oldi)<br> [0..semiTotal]<br><br>sumArrayMod :: IOUArray Int Int -> IO Int
<br>
sumArrayMod arr = foldM (\s i -> do x <- readArray arr i<br> return $!(s+x) `mod` 911) 0 [0..total]<br><br><br>main::IO()<br>main = testArray >>= \a ->
<br> reverseArray a >> reverseArray a >> reverseArray a >> reverseArray a >>
<br> reverseArray a >> reverseArray a >> reverseArray a >> reverseArray a >><br> reverseArray a >> reverseArray a >> reverseArray a >> reverseArray a >><br> reverseArray a >> reverseArray a >> reverseArray a >> reverseArray a >>
<br> sumArrayMod a >>= print<br><br>---------------------------------------------------------------------------------------------------------<br><br>Federico<br><br><br>