2017-10-04 36 views
0

這個問題是涉及到以下問題: 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

回答

3

我認爲,當deepseq上調用列表L」列表L只計算...

正確的。

...這給出了一個有缺陷的基準。

讓我來假設你的「有缺陷」是什麼意思。我想你的意思是,getCurrentTime將返回排序完成前的時間。根據這個假設,不,基準沒有缺陷。但我不確定我可以解釋哪部分理由是錯誤的,但是,因爲你沒有說明你爲什麼認爲基準是有缺陷的。

但是,需要注意的是,我懷疑一個缺陷是從一個你心目中有不同的:你應該確保在輸入列表被調用開始getCurrentTime,因此之前充分評估:

start <- l `deepseq` getCurrentTime 

這可能也可能不重要,具體取決於您如何實施getListFromFiles

+0

而且,不管回答問題如何,我第二@亞歷克建議查看[標準](http://hackage.haskell.org/package/criterion)。 –

+0

你提到的陷阱正是我認爲我的程序存在缺陷的原因。所以,如果我理解正確,如果我寫:「start < - l'deepseq' getCurrentTime」,然後「let l'= map quicksort l」,然後「end < - l''deepseq' getCurrentTime」,我只會測量quicksort算法花費的時間,而不是文件中讀取l的時間? – Florian

+0

@Florian啊,我誤解了這個問題!我很高興我悄悄地在那裏悄悄回答你的實際問題。 =) –