Skip to content

GHCi wrong execution time report

Hello,

using latest GHC 6.6.1 binary package for windows, I've received strange information about execution time for the module below.

My machine: OS WinXP Pro SP2, Intel Core 2, 2GB RAM.

How to reproduce error:

:set +s
:set -02
:cd <path to the file in the attachment>
:l Primes 

Then running

take 10000 primes1
take 10000 primes2
take 10000 primes3
take 10000 primes1'
take 10000 primes2'
take 10000 primes3'

Results seem to be correct, but the execution time reported no. First column is the GHCi report, the second column is th stop-watch data (just to correlate). No other task, except core windows, was running at the moment.

  GHCi    Stop-watch
 236.03     672.2
  63.52      63.9
  63.01      64.0
1098.75     671.0
-365.07      65.2      // it's not a typo, really minus three hundred and sixty five
  63.59      63.6

Best regards,

Dusan


module Primes (
          primes1
         ,primes2
         ,primes3
         ,primes2'
         ,primes3'
       ) where


candidates = map (\x -> (True,x)) [2..]
candidates' =  [2..]

skipmap f toSkip list = domap toSkip list
  where
    domap n (x:xs)
      | n > 1  =  x : domap (n-1) xs
      | True   =  f x : domap toSkip xs
    domap _ [] = []

primes1 = sieve candidates
  where
    sieve (pp@(isp,p):xs) 
      | isp  =  p : (sieve $ skipmap (\(_,v) -> (False,v)) p xs)
      | True =  sieve xs

primes1' = sieve candidates'
  where
    sieve (p:xs) 
      | p > 0  =  p : (sieve $ skipmap (\n -> if n>0 then (-n) else n) p xs)
      | True   =  sieve xs



sieve (p:xs) = p : sieve [y | y <- xs, y `mod` p /= 0]
sieve' (p:xs) = p : sieve [y | y <- xs, y `mod` p > 0]

primes2  = sieve [2..]
primes3 = 2 : sieve [3,5..]

primes2'  = sieve' [2..]
primes3' = 2 : sieve' [3,5..]
Edited by Ian Lynagh -
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information