I'm working through one of Don Stewart's many excellent articles ... http://cgi.cse.unsw.edu.au/~dons/blog/2008/06/04#fast-fusion I faithfully re-created the source of his initial GHC reference implementation as: import System.Environment import Text.Printf mean :: Double -> Double -> Double mean n m = go 0 0 n where go :: Double -> Int -> Double -> Double go s l x | x>m = s / fromIntegral l | otherwise = go (s+x) (l+1) (x+1) main = do [d] <- map read `fmap` getArgs printf "%f\n" (mean 1 d) Then, compiled and executed like this: C:\Documents and Settings\Travis\My Documents\Haskell Code>ghc -O2 biglistmean.hs -optc-O2 -fvia-C --make -fforce-recomp [1 of 1] Compiling Main ( biglistmean.hs, biglistmean.o ) Linking biglistmean.exe ... C:\Documents and Settings\Travis\My Documents\Haskell Code>biglistmean 1000000 500000.5 C:\Documents and Settings\Travis\My Documents\Haskell Code>biglistmean 10000000 5000000.5 C:\Documents and Settings\Travis\My Documents\Haskell Code>biglistmean 100000000 50000000.5 C:\Documents and Settings\Travis\My Documents\Haskell Code>biglistmean 1000000000 500000000.067109 On the final test of 10^9, Don reports that it took 1.76 secs on his machine. In contrast, just 10^8 takes 12.63 secs on my machine (sophisticatedly timed with handheld stopwatch) and on the coup de grace 10^9 test, it takes 2min:04secs. Yikes! My hardware is a little old (Win XP on Pentium 4 3.06GHz w 2 GB RAM) but not THAT old. I'm using the latest Haskell Platform which includes ghc v 6.10.4. Primary question: What gives here? Incidental questions: Is there a nice way to time executed code in Windows ala the "time" command Don shows under Linux? Also, does the ordering of the compiler flags have any impact (I hope not, but I don't want to be surprised ...) Thanks, Travis Erdman |