在Haskell分析时排除开销

时间:2014-07-12 15:36:44

标签: haskell annotations profiling ghc

是否有一种很好的方法可以在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 个答案:

答案 0 :(得分: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)

这似乎只是停止收集时间统计数据,而不是分配。