懒惰如何影响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时评估,并且提供了一个有缺陷的基准。我对么 ?

+0

对于定时基准,请查看基准库。特别是,你可能会最终使用'nf'。确保你首先打开文件,然后用'nf'将自己的'quicksort'调用本身。 – Alec

我认为,当deepseq上调用列表L”列表L只计算...

正确的。

...这给出了一个有缺陷的基准。

让我来假设你的“有缺陷”是什么意思。我想你的意思是,getCurrentTime将返回排序完成前的时间。根据这个假设,不,基准没有缺陷。但我不确定我可以解释哪部分理由是错误的,但是,因为你没有说明你为什么认为基准是有缺陷的。

但是,需要注意的是,我怀疑一个缺陷是从一个你心目中有不同的:你应该确保在输入列表被调用开始getCurrentTime,因此之前充分评估:

start <- l `deepseq` getCurrentTime 

这可能也可能不重要,具体取决于您如何实施getListFromFiles

+0

而且,不管回答问题如何,我第二@亚历克建议查看[标准](http://hackage.haskell.org/package/criterion)。 –

+0

你提到的陷阱正是我认为我的程序存在缺陷的原因。所以,如果我理解正确,如果我写:“start Florian

+0

@Florian啊,我误解了这个问题!我很高兴我悄悄地在那里悄悄回答你的实际问题。 =) –