[Haskell-cafe] Very fast loops. Now!

Rafael Almeida almeidaraf at gmail.com
Sat Feb 10 12:26:38 EST 2007


On 2/10/07, Donald Bruce Stewart <dons at cse.unsw.edu.au> wrote:
> The following C program was described on #haskell
>
>     #include <stdio.h>
>
>     int main()
>     {
>         double x = 1.0/3.0;
>         double y = 3.0;
>         int i    = 1;
>         for (; i<=1000000000; i++) {
>             x = x*y/3.0;
>             y = x*9.0;
>         }
>         printf("%f\n", x+y);
>     }
>
>
> Which was translated to the following Haskell:
>
>     {-# OPTIONS -fexcess-precision #-}
>
>     import Text.Printf
>
>     main = go (1/3) 3 1
>
>     go :: Double -> Double -> Int -> IO ()
>     go !x !y !i
>         | i == 1000000000 = printf "%f\n" (x+y)
>         | otherwise       = go (x*y/3) (x*9) (i+1)

I've compiled the exactly same programs, passing the same parameters to
the compiler as you did, but I've got a very different result:

  $ ghc -O -fexcess-precision -fbang-patterns -optc-O3 -optc-ffast-math\
  -optc-mfpmath=sse -optc-msse2 loop.hs -o haskell_loop
  $ time ./haskell_loop
  3.3333333333333335

  real    0m14.092s
  user    0m14.057s
  sys     0m0.036s
  $ ghc --version
  The Glorious Glasgow Haskell Compilation System, version 6.6

While the haskell program took so long, the C program went really faster
than the haskell version:
  $ gcc -O3 -ffast-math -mfpmath=sse -msse2 -std=c99 loop.c -o c_loop
  $ time ./c_loop
  3.333333

  real    0m0.001s
  user    0m0.000s
  sys     0m0.000s
  $ gcc --version
  gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)

I'm using debian etch (linux), my processor is a pentium 4 3.0ghz, which
has sse and sse2 (or at least /proc/cpuinfo says so). As for memory, it
probably doesn't matter much in this test, but I have 512mB of ram.

In a similar thread that was posted at comp.lang.functional (it was
actually regarding ocaml vs C++, you can find it on google groups at
http://tinyurl.com/292ps6 ) the same kind of discrepancy occurred.
Showing that this kind of benchmarking is usually not very accurate or,
at least, that my processor is not well suited for functional languages
:P.


More information about the Haskell-Cafe mailing list