[Haskell-cafe] Re: Very fast loops. Now!

Eric Willigers ewilligers at gmail.com
Mon Feb 12 06:13:34 EST 2007

Eric Willigers wrote:
> Do the two programs implement the same algorithm? The C program updates 
> x and y in sequence. The Haskell program updates x and y in parallel and 
> can be easier for the compiler to optimize.

Hi Don,

Expressing this in other words, do we want the new y to be based on the 
new x or on the old x?

I extracted the code you posted to CS.c and HP.hs (C sequential, Hashell 

I made the following minor changes to form CP.c and HS.hs (C parallel, 
Hashell sequential):-

     double xn;
     for (; i<=1000000000; i++) {
         xn = x*y/3.0;
         y = x*9.0;
         x = xn;

     | otherwise       = go xs (xs*9) (i+1)
                         where xs = x*y/3

Tested on a 2.8 GHz Pentium 4, running XP SP2 and cygwin, using the 
compiler options from your post. Each program was run once.

$ uname -a
CYGWIN_NT-5.1 nemo 1.5.21(0.156/4/2) 2006-07-30 14:21 i686 Cygwin

$ gcc --version
gcc (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.6

$ gcc -O3 -ffast-math -mfpmath=sse -msse2 -std=c99 CP.c -o CP

$ time ./CP

real    0m10.560s
user    0m10.546s
sys     0m0.015s

$ gcc -O3 -ffast-math -mfpmath=sse -msse2 -std=c99 CS.c -o CS

$ time ./CS

real    0m10.788s
user    0m10.718s
sys     0m0.015s

$ ghc -O -fexcess-precision -fbang-patterns -optc-O3 -optc-ffast-math 
-optc-mfpmath=sse -optc-msse2 HP.hs -o HP

$ time ./HP

real    1m8.550s
user    0m0.015s
sys     0m0.031s

$ ghc -O -fexcess-precision -fbang-patterns -optc-O3 -optc-ffast-math 
-optc-mfpmath=sse -optc-msse2 HS.hs -o HS

$ time ./HS

real    1m9.425s
user    0m0.015s
sys     0m0.046s

The differences between the P and S versions turned out to be incidental 
on my system.

I downloaded GHC a month ago. Should I be running a more recent build or 
using different compiler options?


More information about the Haskell-Cafe mailing list