懒惰如何影响Haskell的基准测试?
这个问题是涉及到以下问题: How to force evaluation in Haskell?懒惰如何影响Haskell的基准测试?
我想基准列表中的快速排序算法。为此,我制作了一定数量的文件,其中包含随机数字。
这里是有问题的代码的相关部分:
import System.IO
import Data.Time
import Control.DeepSeq
getListFromFiles :: IO [[Int]]
quicksort :: (Ord a) => [a] -> [a]
main = do
l <- getListFromFiles
start <- getCurrentTime
let l' = map quicksort l
end <- l' `deepseq` getCurrentTime
print (diffUTCTime end start)
我不想知道要测量的计划需要寻找到这些文件,只是排序取一个时间。 由于懒惰,我认为列表l仅在列表l'上调用deepseq时评估,并且提供了一个有缺陷的基准。我对么 ?
我认为,当deepseq上调用列表L”列表L只计算...
正确的。
...这给出了一个有缺陷的基准。
让我来假设你的“有缺陷”是什么意思。我想你的意思是,getCurrentTime
将返回排序完成前的时间。根据这个假设,不,基准没有缺陷。但我不确定我可以解释哪部分理由是错误的,但是,因为你没有说明你为什么认为基准是有缺陷的。
但是,需要注意的是,我怀疑一个缺陷是从一个你心目中有不同的:你应该确保在输入列表被调用开始getCurrentTime
,因此之前充分评估:
start <- l `deepseq` getCurrentTime
这可能也可能不重要,具体取决于您如何实施getListFromFiles
。
而且,不管回答问题如何,我第二@亚历克建议查看[标准](http://hackage.haskell.org/package/criterion)。 –
你提到的陷阱正是我认为我的程序存在缺陷的原因。所以,如果我理解正确,如果我写:“start Florian
@Florian啊,我误解了这个问题!我很高兴我悄悄地在那里悄悄回答你的实际问题。 =) –
对于定时基准,请查看基准库。特别是,你可能会最终使用'nf'。确保你首先打开文件,然后用'nf'将自己的'quicksort'调用本身。 – Alec