Re-timing

I have a very simple function f :: Int -> Int

and I want to write a program that calls f

for everyone n = 1,2,...,max

. After each call f

, the (cumulative) time that has been used up to that point (together with n

and f n

) should be displayed . How can this be done?

I'm still new to I / O in Haskell, so this is what I've tried so far (using some toy example function f

)

f :: Int -> Int
f n = sum [1..n]

evalAndTimeFirstN :: Int -> Int -> Int -> IO()
evalAndTimeFirstN n max time = 
  if n == max 
   then return () -- in the following we have to calculate the time difference from start to now
   else let str =  ("(" ++ (show n) ++  ", " ++ (show $ f n) ++ ", "++ (show time)++ ")\n") 
         in putStrLn str >> evalAndTimeFirstN (n+1) max time -- here we have to calculate the time difference

main :: IO()
main = evalAndTimeFirstN 1 5 0

      

I don't quite understand how I should enter the time here. ( Int

for time

probably needs to be replaced with something else.)

+3


source to share


2 answers


Finally I managed to find a solution. In this case, we measure the "real" time in ms.



import Data.Time
import Data.Time.Clock.POSIX

f n = sum[0..n]

getTime = getCurrentTime >>= pure . (1000*) . utcTimeToPOSIXSeconds >>= pure . round

main = do 
    maxns <- getLine 
    let maxn = (read maxns)::Int
    t0 <- getTime 
    loop 1 maxn t0
     where loop n maxn t0|n==maxn = return ()
           loop n maxn t0
             = do 
                 putStrLn $ "fun eval: " ++ (show n) ++ ", " ++ (show $ (f n)) 
                 t <- getTime
                 putStrLn $ "time: " ++ show (t-t0); 
                 loop (n+1) maxn t0

      

0


source


You probably want something like this. Adapt the following basic example for your recursive function as needed.

import Data.Time.Clock
import Control.Exception (evaluate)

main :: IO ()
main = do
  putStrLn "Enter a number"
  n <- readLn
  start <- getCurrentTime
  let fact = product [1..n] :: Integer
  evaluate fact  -- this is needed, otherwise laziness would postpone the evaluation
  end <- getCurrentTime
  putStrLn $ "Time elapsed: " ++ show (diffUTCTime end start)
  -- putStrLn $ "The result was " ++ show fact

      



Uncomment the last line to print the result (it gets very big very quickly).

0


source







All Articles