此问题与以下问题有关: 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时进行评估。这给出了一个有缺陷的基准。我是对的吗?
答案 0 :(得分:3)
我认为列表l仅在列表l'...
上调用deepseq时进行评估
正确。
......这给出了一个有缺陷的基准。
让我假设“有缺陷”是什么意思。我想你的意思是getCurrentTime
将在排序完全完成之前返回一个时间。在这个假设下,不,基准没有缺陷。我不确定我能解释你推理的哪一部分是错误的,因为你没有说为什么你认为基准会有缺陷。
然而,有一个陷阱要注意我怀疑与你想到的不同:你应该确保在调用起始{{}之前完全评估了输入列表。 1}},因此:
getCurrentTime
这可能或不重要,具体取决于您实施 start <- l `deepseq` getCurrentTime
的具体方式。