could anybody help me to understand the following small benchmark
for  ghc-2.08:

------------------------------------------------------------------
-- Illustration for the "lazy" lists.
--
-- Infinite list of primes - NOT very efficient:

primes' =  sieve [2..]  :: [Int] 
         where 
         sieve (p:ns) =  p: (sieve (filter (\n->(mod n p)/=0) ns))

main =  
  let  n = 1000 
  in
    putStr (shows  (primes'!!(n+1))  "\n")                 --(P1)

    --putStr (shows  (primes'!!n, primes'!!(n+1)) "\n")    --(P2)

    --putStr
    --  (shows  (primes'!!n, primes'!!(n+1), primes'!!(quot n 2)) 
    --          "\n"
    --  )                                                  --(P3)
------------------------------------------------------------------



How much should differ in the running time the variants (P1),(P2),
(P3) ?

In  ghc-2.08 linux,  - binary snapshot by Sven Panne - 

PC-486, 120MHz,   `time ./run +RTS -H4m'     it costs:

                                         `ghc -c -O Main.hs'  `ghc -c'
(P1):  7933             --p(n+1)              6.5             9.1
(P2):  (7927,7933)      --p(n),p(n+1)         9.1             9.3
(P3):  (7927,7933,3581) --p(n),p(n+1),p(n/2)  9.1             9.2


The column for the `ghc -c' compilation looks natural: the costs of 
(Pi) are all the same.
Because the (!!) function invocates not more than 3 times, and this 
costs much cheaper than the whole program. Further, the first (n+1)
values in  primes'  needed in  (P2)  for the first component of the 
pair also participate in the evaluation of the second component.
The interpreter re-uses these values.
I expect this is the evaluation principle in ghc - right?

But why  (P2)-c-O  differs so much from  (P1)-c-O  ?


Thank you in advance.


------------------
Sergey Mechveliani

[EMAIL PROTECTED]





Reply via email to