hodatime-1.0.0.0: bench/HodaTime/InstantBench.hs
module HodaTime.InstantBench
(
instantBenches
)
where
import Criterion.Main
import Data.List (foldl')
import qualified Data.HodaTime.Instant as I
import qualified Data.HodaTime.Duration as D
-- | Force an 'Instant' completely (its 'Show' touches every field), returning an 'Int' so criterion's 'nf' has
-- something fully-evaluable to hold on to.
forceI :: I.Instant -> Int
forceI = length . show
forceD :: D.Duration -> Int
forceD = length . show
instantBenches :: Benchmark
instantBenches = bgroup "Instant/Duration"
[
bench "add second" $ nf (forceI . I.add base) oneSec
,bench "add nano" $ nf (forceI . I.add base) oneNano
,bench "minus second" $ nf (forceI . I.minus base) oneSec
,bench "difference" $ nf (forceD . I.difference far) base
,bench "duration add" $ nf (forceD . D.add dSec) dNano
,bench "accumulate 10k adds sec" $ nf (\n -> forceI (foldl' I.add base (replicate n oneSec))) 10000
,bench "accumulate 10k adds nano" $ nf (\n -> forceI (foldl' I.add base (replicate n oneNano))) 10000
]
where
base = I.fromSecondsSinceUnixEpoch 1000000000
far = I.fromSecondsSinceUnixEpoch 1500000000
oneSec = D.fromSeconds 1
oneNano = D.fromNanoseconds 1
dSec = D.fromSeconds 3600
dNano = D.fromNanoseconds 123456789