
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/ --------------------------------------------------------------------