@@ -0,0 +1,30 @@
1+{-# LANGUAGE BangPatterns #-}
3+module Timer (timer) where
5+import Control.Exception (evaluate)
6+import Data.Time.Clock.POSIX (getPOSIXTime)
7+import GHC.Float (FFFormat(..), formatRealFloat)
9+ickyRound :: Int -> Double -> String
10+ickyRound k = formatRealFloat FFFixed (Just k)
12+timer :: Int -> a -> (a -> b) -> IO String
15+ | k <= 0 = return fastest
17+ start <- getPOSIXTime
20+ | otherwise = evaluate (f a) >> inner a (i-1)
23+ let elapsed = end - start
24+ loop (k-1) (min fastest (elapsed / fromIntegral count))
25+ t <- loop (3::Int) 1e300
26+ let log10 x = log x / log 10
28+ prec = round (log10 (fromIntegral count) - log10 ft)
29+ return $! ickyRound prec ft
30+{-# NOINLINE timer #-}