Magnus Therning wrote:
  timeIt times ioa = let
          timeOnce = do
              t1 <- getCPUTime
              a <- ioa
              t2 <- getCPUTime
              let t = fromIntegral (t2-t1) * 1e-12
              return t
          in sequence $ take times $ repeat timeOnce

  main = do
      fh <- openBinaryFile "/dev/urandom" ReadMode
      d <- liftM BS.unpack $ BS.hGet fh 100000
      t <- timeIt 10 $ return $! B64.encode d
      print t


I suspect that it all comes from `B64.encode d` being pure, hence the
encoding happens only once.  Now I _really_ want the encoding to
happen 10 times, is there some easy way to achieve this?

A quick answer - not a lot of thought - pass function *and* argument separately into timeIt ?

 timeIt times ioaf ioaarg
     ....   a <- ioaf ioaarg

As it stands you pass the thunk (B64.encode d) in so it only gets evaluated once If you pass the function and argument in then a new thunk is built each time around
(unless the optimiser nabbles it.......)
/M

[1]: http://hackage.haskell.org/cgi-bin/hackage-scripts/package/timeit
[2]:


--
--------------------------------------------------------------------
Andrew Butterfield     Tel: +353-1-896-2517     Fax: +353-1-677-2204
Foundations and Methods Research Group Director.
School of Computer Science and Statistics,
Room F.13, O'Reilly Institute, Trinity College, University of Dublin
                           http://www.cs.tcd.ie/Andrew.Butterfield/
--------------------------------------------------------------------

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to