gpt4 book ai didi

Haskell计算函数执行时间

转载 作者:行者123 更新时间:2023-12-04 16:29:21 24 4
gpt4 key购买 nike

我试图编写代码来计算函数花费的时间

list <- buildlist 10000 10000    
starttime <- getClockTime
let sortedlist = quicksort list
endtime <- getClockTime
let difftime = diffClockTimes endtime starttime

功能构建列表:
buildlist :: Int -> Int -> IO [Int]
buildlist n m = do
seed <- getStdGen
let l = randomRs (0, m) seed
let list = take n l
return list

功能快速排序:
quicksort [] = []
quicksort (x:xs) =
let head = [a|a<-xs,a<=x]
tail = [a|a<-xs,a>x]
in quicksort head ++ [x] ++ quicksort tail

第一个问题:当我输出 difftime 时,无论列表有多长,它总是为零。

第二个:我想知道 Real World Haskell 的代码中的“>>=”是什么方法。
getClockTime >>= (\(TOD sec _) -> return sec)

第三:我写这篇文章是为了得到 tdSec tdPicosec 来自 时差 多变的。
有没有更简单的方法?
time <-(\(TimeDiff _ _ _ _ _ s ps) -> return [ ( \a -> fromIntegral a :: Double ) s , ( \a -> fromIntegral a :: Double ) ps ] ) difftime

最佳答案

问题一:

您的代码没有对列表进行排序!它只是定义了名称 sortedlist作为 quicksort list但这在实际需要该值之前不会计算。那是懒惰的评价。我们不会用这种语言做额外的工作。

由于基准测试是额外无用的工作(这就是重点),这使得基准测试变得困难。

您的选择

  • 使用seq . seq有类型 a -> b -> b并且具有将其第一个参数评估为所谓的“弱头范式”的行为。在这里,因为你想强制整个列表,你可能想使用 deepseq
  • 使用适当的基准测试包,如 criterion (首选且更简单)

  • 问题2:
    >>=是一元绑定(bind)运算符。这里需要一个 IO IO a 类型的操作和一个函数 a -> IO b并将它们组合在一起以创建 IO b 类型的新操作.这与 do 表示法的作用相同。 foo >>= \x -> expr是一样的
     do x <- foo
    expr

    事实上, do符号只是 >>= 的语法糖

    我不确定问题 3 中要问的是什么——也许它应该有自己的 Stackoverflow 问题。

    关于Haskell计算函数执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16050917/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com