[Haskell-cafe] Haskell performance question
Don Stewart
dons at galois.com
Thu Nov 8 17:28:41 EST 2007
bulat.ziganshin:
> Hello Don,
>
> Thursday, November 8, 2007, 10:53:28 PM, you wrote:
>
> >> a <- newArray (0,n-1) 1.0 :: IO (IOUArray Int Double)
> >> forM_ [0..n-2] $ \i -> do { x <- readArray a i; y <- readArray a
> >> (i+1); writeArray a (i+1) (x+y) }
>
> oh, i was stupid. obviously, first thing you need to do is to use
> unsafeRead/unsafeWrite operations. i'm wonder how this code is only
> 20x slower than C version, may be you need to use gcc -O3 -funroll-loops
> and gcc3 (because gcc4 becomes slower)
I think you use a different computer to me. Out of the box, amd64, ghc
6.8, with the same n=100000000, Dan's original code runs:
$ ghc -O2 A.hs
$ time ./A_slow
1.0e8
./A_slow 1.60s user 0.50s system 95% cpu 2.193 total
and the C program
$ gcc -O2 A.c -o A_c
$ time ./A_c
100000000.000000
./A_c 1.03s user 0.52s system 96% cpu 1.612 total
without using any special flags. A 1.3x slowdown such as this is more
typical of low level array programs.
If I awa a > 5x slow down it would be considered a bug, and its been a
/long/ time since I've seen a 20x slowdown.
Note that with ghc 6.6, we get:
$ time ./A_66
A_66: out of memory (requested 1048576 bytes)
./A_66 4.94s user 0.78s system 99% cpu 5.735 total
So I know which compiler I prefer.
-- Don
More information about the Haskell-Cafe
mailing list