2014-07-12 74 views
3

有沒有一種很好的方法可以將某些函數調用從Haskell分析中排除?Haskell性能分析時排除開銷

我加載在字典中,這需要一對夫婦的第二個完全的大二進制轉儲月食我感興趣的代碼位。

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