
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