
On Tuesday 08 November 2011, 14:54:18, Silvio Frischknecht wrote:
On 11/08/2011 02:19 PM, Ryan Yates wrote:
If I compile with optimizations:
ghc --make -O3 primes.hs
So far, -O3 is not different from -O2 (-On gives you -O2 for n > 2). *Never* compile code you want to use without optimisations. Compiling without optimisations is strictly for development, when compilation time matters because of frequent recompilation. Once things have stabilised, compile them with optimisations only.
I get an answer that is off by one from the C++ program in a few seconds.
nice one. Though i wonder. The problem seems to be that without optimization sum is not tail-recursive. Is sum meant to not be tail-recursive?
Well, it is tail recursive (foldl, basically), but not strict. So without optimisations you get the worst of boths worlds (tail recursion means no incremental output, as could be possible with foldr for lazy number types, not being strict in the accumulator means it builds huge thunks, like foldr with a function strict in the second argument).
ghci> sum [1..]
eats up all the memory within seconds while
ghci> foldl' (+) 0 [1..]
does not
So Mukesh if you want your program to run without -Ox you should probably define your one sum'
import Data.List sum' = foldl' (+) 0
That'd help, it would still be dog-slow, though, since optimisation is also crucial for the sieve.
Silvio