Haskell 功能重复计时
我有一个非常简单的函数Haskell 功能重复计时,haskell,monads,timing,Haskell,Monads,Timing,我有一个非常简单的函数f::Int->Int,我想编写一个程序,为每个n=1,2,…,max调用f。每次调用f后,应显示截至该点的(累计)使用时间(以及n和fn)。如何实现这一点 我对Haskell中的输入/输出还很陌生,所以这就是我到目前为止所尝试的(使用一些玩具示例函数f) 我不太明白我该如何在这里介绍时间。(时间的Int可能需要替换为其他内容。)您可能需要这样的内容。根据递归函数的需要调整以下基本示例 import Data.Time.Clock import Control.Except
f::Int->Int
,我想编写一个程序,为每个n=1,2,…,max
调用f
。每次调用f
后,应显示截至该点的(累计)使用时间(以及n
和fn
)。如何实现这一点
我对Haskell中的输入/输出还很陌生,所以这就是我到目前为止所尝试的(使用一些玩具示例函数f
)
我不太明白我该如何在这里介绍时间。(时间
的Int
可能需要替换为其他内容。)您可能需要这样的内容。根据递归函数的需要调整以下基本示例
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
导入数据.Time.Clock
导入控制。异常(评估)
main::IO()
main=do
putStrLn“输入一个数字”
我终于找到了解决办法。在这种情况下,我们测量的是以毫秒为单位的“实时”
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
导入数据。时间
导入Data.Time.Clock.POSIX
fn=总和[0..n]
getTime=getCurrentTime>>=pure。(1000*) . utcTimeToPOSIXSeconds>>=纯。圆形的
main=do
maxns最好将基准测试委托给一个专门的工具,例如,谢谢你的链接!现在这对我来说似乎有点太难了,所以我想在使用像这样的库之前,我仍然会尝试坚持一种基本的方法,因为我想学习如何做到这样的想法。在一种懒惰的语言中,很难正确地进行基准测试,而且是双重的。如果你想要准确的结果,我不建议你自己滚动。我可能应该强调的是,这不是为了获得准确的基准测试结果,而是为了学习如何使用这些单子而构建的一个示例,因为它们对我来说仍然很难理解。到目前为止,我已经找到了类似的片段,但是如果你想测量所有n=1,2,…,max
的时间,而不仅仅是一段n
,我不知道如何应用这个,所以你需要对那些n
进行某种循环,但这就是我被卡住的地方。@probler但是你自己的代码使用递归进行这样的循环。这可能不是最好的款式,但很管用。我将在代码中介绍对getCurrentTime
的调用。
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