懒惰如何影响Haskell的基准测试?

时间:2017-10-04 12:08:53

标签: haskell lazy-evaluation

此问题与以下问题有关: How to force evaluation in 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&#39;上调用deepseq时进行评估。这给出了一个有缺陷的基准。我是对的吗?

1 个答案:

答案 0 :(得分:3)

  

我认为列表l仅在列表l'...

上调用deepseq时进行评估

正确。

  

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

让我假设“有缺陷”是什么意思。我想你的意思是getCurrentTime将在排序完全完成之前返回一个时间。在这个假设下,不,基准没有缺陷。我不确定我能解释你推理的哪一部分是错误的,因为你没有说为什么你认为基准会有缺陷。

然而,有一个陷阱要注意我怀疑与你想到的不同:你应该确保在调用起始{{}之前完全评估了输入列表。 1}},因此:

getCurrentTime

这可能或不重要,具体取决于您实施 start <- l `deepseq` getCurrentTime 的具体方式。