on 1.1 help sign in
30 lines 914 B history raw
1{-# LANGUAGE BangPatterns #-}
3module Timer (timer) where
5import Control.Exception (evaluate)
6import Data.Time.Clock.POSIX (getPOSIXTime)
7import GHC.Float (FFFormat(..), formatRealFloat)
9ickyRound :: Int -> Double -> String
10ickyRound k = formatRealFloat FFFixed (Just k)
12timer :: Int -> a -> (a -> b) -> IO String
13timer count a0 f = do
14 let loop !k !fastest
15 | k <= 0 = return fastest
16 | otherwise = do
17 start <- getPOSIXTime
18 let inner a i
19 | i <= 0 = return ()
20 | otherwise = evaluate (f a) >> inner a (i-1)
21 inner a0 count
22 end <- getPOSIXTime
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
27 ft = realToFrac t
28 prec = round (log10 (fromIntegral count) - log10 ft)
29 return $! ickyRound prec ft
30{-# NOINLINE timer #-}