
Hello - I've been trying to measure execution time for some code I'm running with the StateT monad transformer. I have a function f :: StateT MyState IO a Now, I measure the time it takes to run an invocation of this function from beginning to end, i.e. f = do t0 <- getCurrentTime stuffToDo t1 <- getCurrentTime liftIO $ putStrLn (show $ diffUTCTime t1 t0) And also measure like this: g :: IO g = do t0 <- getCurrentTime (val,newState) <- runStateT f initialState t1 <- getCurrentTime putStrLn $ "outside: " ++ (show $ diffUTCTime t1 t0) Curiously, the times reported for "outside" are about 5-8 times as long. I should probably note that stuffToDo calls itself a few hundred times (and uses liftIO once per loop). Anyone with ideas on why runStateT apparently has so much overhead? By the way I'm using ghc-6.10.4 and Control.Monad.Trans.State.Strict. Thanks for any suggestions or advice. Thomas