【问题标题】:Exclude Overheads while Haskell Profiling在 Haskell 分析时排除开销
【发布时间】:2014-07-12 15:36:43
【问题描述】:

有没有一种好方法可以从 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 注释安排意味着我可以偷偷地完成所有开销加载,而不会将其计入我的整体统计数据?

【问题讨论】:

  • 您是否尝试过将Data.Set.fromList . string_read . toString . Prelude.head . Text.lines 移动到一个单独的函数中,以便从文件中读取所有read_wordlist 然后调用此函数?我还建议使用BangPatterns 进行一些严格注释,以便您可以准确指出您的时间花在哪里。

标签: haskell annotations profiling ghc


【解决方案1】:

从 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)

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

【讨论】:

  • 啊,我正在翻阅手册寻找“重置计时器”“从分析中排除”等 - 这很棒。
  • 这个包还存在吗?我似乎无法在 cabal 或 Hackage 上找到它,尽管在某个时间点上有一个参考的幽灵 (hackage.haskell.org/package/base-4.7.0.0/docs/…)
  • 我的意思是你链接到的那个。但它是如何“回到过去”的呢? base-4.7.0.0 是 GHC 7.8 自带的版本。显然它在这个版本中是新的(我会修改答案)。
猜你喜欢
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 2014-01-30
相关资源
最近更新 更多