Timing computations
Revision as of 21:29, 28 February 2009 by DonStewart (talk | contribs)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Timing an IO computation.
import Text.Printf
import Control.Exception
import System.CPUTime
time :: IO t -> IO t
time a = do
start <- getCPUTime
v <- a
end <- getCPUTime
let diff = (fromIntegral (end - start)) / (10^12)
printf "Computation time: %0.3f sec\n" (diff :: Double)
return v
main = do
putStrLn "Starting..."
time $ product [1..10000] `seq` return ()
putStrLn "Done."
And running this.
$ runhaskell A.hs
Starting...
Computation time: 1.141 sec
Done.
See also Timing out computations and Timing computation in cycles.
Timing a pure computation:
import Text.Printf
import Control.Exception
import System.CPUTime
import Control.Parallel.Strategies
import Control.Monad
import System.Environment
lim :: Int
lim = 10^6
time :: (Num t, NFData t) => t -> IO ()
time y = do
start <- getCPUTime
replicateM_ lim $ do
x <- evaluate $ 1 + y
rnf x `seq` return ()
end <- getCPUTime
let diff = (fromIntegral (end - start)) / (10^12)
printf "Computation time: %0.9f sec\n" (diff :: Double)
printf "Individual time: %0.9f sec\n" (diff / fromIntegral lim :: Double)
return ()
main = do
[n] <- getArgs
let y = read n
putStrLn "Starting..."
time (y :: Int)
putStrLn "Done."