2017-10-04 4 views
0

이 질문은 다음과 같은 질문에 관련 : 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은 deepseq가 목록에서 호출 될 때만 평가되며 이는 결함있는 벤치 마크를 제공한다고 생각합니다. 나 맞아 ?

+0

타이밍 벤치 마크의 경우 기준 라이브러리를 살펴보십시오. 특히'nf'를 사용하게 될 것입니다. 파일을 열어서'quicksort' 호출 자체를'nf'로 묶어야합니다. – Alec

답변

3

나는

올바른 ... deepseq이리스트 L '에 호출 될 때리스트 L 만 평가라고 생각합니다.

... 결함있는 벤치 마크를 제공합니다.

"결함이 있음"이 의미하는 바를 가정 해 봅시다. 당신이 의미하는 바는 getCurrentTime은 정렬이 완전히 끝나기 전의 시간을 반환한다는 것입니다. 이 가정하에, 아니오, 벤치 마크에는 결함이 없습니다. 나는 당신의 추론 중 어느 부분이 잘못되었는지를 설명 할 수 있는지 확신 할 수 없다. 왜 당신은 벤치 마크가 결함이 있다고 생각하는지 말하지 않기 때문이다.

그러나, 나는 의심이주의해야 할 함정은 당신이 생각했던 것과 다른 존재입니다 : 당신이 있는지 확인해야 입력 목록을 완전히 따라서, 시작 getCurrentTime를 호출하기 전에 평가된다 :

start <- l `deepseq` getCurrentTime 

getListFromFiles을 어떻게 구현했는지에 따라 중요하거나 중요하지 않을 수 있습니다.

+0

질문에 답하는 것과는 별도로, 나는 [criterion] (http://hackage.haskell.org/package/criterion)을 볼 때 두 번째로 알렉 (Alec)의 추천을 받는다. –

+0

당신이 언급 한 함정은 내 프로그램에 결함이 있다고 생각한 이유입니다. 그래서, 내가 올바르게 이해한다면, "start -l'deepseq' getCurrentTime"then "let l '= map quicksort l"그리고 나서 "end -l"'deepseq' getCurrentTime "라고 쓰면, 퀵 소트 알고리즘이 걸리는 시간이지, 내가 파일에서 읽은 시간이 아닌가? – Florian

+0

@Florian 아, 나는 그 질문을 오해했다! 우연히 실제 질문에 대한 답변을 찾을 수있어서 다행입니다. =) –

관련 문제