2014-07-12 2 views
3

하스켈에서 특정 함수 호출을 프로파일 링에서 제외시키는 좋은 방법이 있습니까? 내가 완전히 두 번째의 부부를 받아 사전의 큰 바이너리 덤프를로드하고있어하스켈 프로파일 링 동안 오버 헤드 제외

내가 해요. 내가 관심이있는 코드의 비트를 능가 참고로

COST CENTRE   MODULE  %time %alloc 

read_wordlist  Wordlists 93.6 98.3 
solve    Solver  1.3 0.0 
anagrams    Evaluation 0.8 1.4 
[...] 

이런 식의 로딩은

read_wordlist = do 
    ls <- fmap Text.lines (Text.readFile "data/straight-wordlist") 
    (return . Data.Set.fromList . string_read . toString . Prelude.head) ls 

이며, 모든 코드는 모듈로 구분되어 있습니다 (그러나 꽤 바닐라 등).

SCC 주석의 일부 배열이 있습니다. 즉, 모든 오버 헤드 로딩을 ​​할 수 있고 전반적인 통계에 포함시키지 않아도된다는 의미입니까?

+1

'Data.Set.fromList. string_read. toString. Prelude.head. Text.lines'를 별도의 함수로 묶어서'read_wordlist'가 파일로부터 읽은 다음이 함수를 호출하도록합니다. 'BangPatterns'와 함께 몇 가지 엄격한 주석을 제안하면 시간이 어디서 쓰이고 있는지 정확하게 지적 할 수 있습니다. – bheklilr

답변

0

GHC 7.8을 시작으로, 당신은 할 수 있습니다 :

import GHC.Profiling 
import Control.Deepseq 

main = do 
    stopProfTimer 
    wordlist <- read_wordlist 
    return $!! wordlist -- Ensure it is fully evaluated in the untimed section 
    startProfTimer 
    print (solve wordlist) 

이것은 단지,하지만 할당 시간 통계의 수집을하지 중지 것으로 보인다.

+0

아, 나는 매뉴얼을 통해 '타이머 재설정'을 '프로파일 링 제외'등을 찾으면서 크롤링하고있었습니다. 이것은 훌륭합니다. – skelly

+0

이 패키지가 아직 존재합니까? 나는 cabal이나 [Hackage] (https://hackage.haskell.org/packages/)에서 그것을 발견 할 수없는 것 같다. 비록 시간이 지날수록 참조의 유령이있다. (https : //hackage.haskell .org/package/base-4.7.0.0/docs/GHC-Profiling.html) – skelly

+0

나는 연결된 사람을 의미했습니다. 그러나 그것은 어떻게 "시간 안에"있습니까? 'base-4.7.0.0'은 GHC 7.8 버전입니다. 외관상으로는이 버전에서 (응답을 수정할 것이다) 새롭다. – FunctorSalad