
Yesterday I spent about 5 minutes trying to time a single function in haskell (after having spent about 30 minutes on the timeit module in Python). I found timeit[1] on Hackage but it only times an IO computation once, what I'd like to do is time a pure function several times. Timing it once was no problem, passing `return $! myPureFunc` to `timeIt` did that[2]. My feeble attempt at collecting several timings failed though. import System.CPUTime import qualified Codec.Binary.Base64 as B64 import System.IO import qualified Data.ByteString as BS import Control.Monad 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 Running this on my machine produces the output [2.3331e-2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]. I.e. the first time the data is encoded, but the following 9 times it's not. 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? /M [1]: http://hackage.haskell.org/cgi-bin/hackage-scripts/package/timeit [2]: -- Magnus Therning (OpenPGP: 0xAB4DFBA4) magnus@therning.org Jabber: magnus@therning.org http://therning.org/magnus identi.ca|twitter: magthe