[Haskell-cafe] Re: Difference in Runtime but no explanation

Maciej Piechotka uzytkownik2 at gmail.com
Tue Dec 15 13:30:06 EST 2009


On Tue, 2009-12-15 at 09:52 -0800, Johann Höchtl wrote:
> Hello,
> 
> I'm still to Haskell, and after I read through
> http://users.aber.ac.uk/afc/stricthaskell.html#seq
> 
> I thought, that these tow fragments after term rewriting are really
> the same:
> 
> myLength :: [a] -> Integer
> myLength xs = len xs 0
>     where len [] l = l
>           len (x:xs) l = l `seq` len xs (l+1)
> 
> main = print $ myLength [1..10000000]
> 
> 
> -- vs.
> 
> myLength :: [a] -> Integer
> myLength xs = len xs 0
> where len [] l = l
>       len (x:xs) l = len xs $! (l+1)
> 
>       main = print $ myLength [1..10000000]
> 
> main = print $ myLength [1..10000000]
> 
> But the first expression evaluates more then twice as fast as the
> second one. Tested on GHC 6.10.4 and Windows XP, dual core (for what
> it's worth)
> 
> It's on http://moonpatio.com/fastcgi/hpaste.fcgi/view?id=5321#a5321
> btw.
> 
> I can't see the difference, especially as $! is expressed in terms of
> seq

The second one is IMGO:
myLength :: [a] -> Integer
myLength xs = len xs 0
              where len [] l = l
                    len (x:xs) l = let l' = l+1
                                   in l' `seq` len xs l'

So in thew first + is not forced to be evaluated.

My results (ghc 6.12.1, Core 2 Duo 2.8 GHz, Linux 2.6.32, Gentoo):

Not Optimized & not compiled:
First:	12.47 secs, 1530911440 bytes
Second:	17.40 secs, 1929614816 bytes
Optimized & compiled:
First:	 1.24 secs, 966280832 bytes
Second:	 1.11 secs, 966277152 bytes

Repeating gave similar results - first being better w/out
optimalization as 1.2:1.7 and second being better with optimalizations (-O).

Why the first one is better unoptimalized?

Regards




More information about the Haskell-Cafe mailing list