[Haskell-cafe] Timing pure functions?
Magnus Therning
magnus at therning.org
Wed May 27 05:12:10 EDT 2009
On Wed, May 27, 2009 at 9:59 AM, Andrew Butterfield
<Andrew.Butterfield at cs.tcd.ie> wrote:
> 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.......)
Hmm, my naive implementation of that didn't improve the situation, `t
<- timeIt 10 (\ x -> return $! B64.encode x) d` still results in only
one measurement /= 0.
Of course that also makes `timeIt` less general.
/M
--
Magnus Therning (OpenPGP: 0xAB4DFBA4)
magnus@therning.org Jabber: magnus@therning.org
http://therning.org/magnus identi.ca|twitter: magthe
More information about the Haskell-Cafe
mailing list