在 Haskell 分析时排除开销

Posted

技术标签:

【中文标题】在 Haskell 分析时排除开销【英文标题】:Exclude Overheads while Haskell Profiling 【发布时间】: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 进行一些严格注释,以便您可以准确指出您的时间花在哪里。 【参考方案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 自带的版本。显然它在这个版本中是新的(我会修改答案)。

以上是关于在 Haskell 分析时排除开销的主要内容,如果未能解决你的问题,请参考以下文章

分析 Haskell 代码但不包括库分析信息

Haskell 分析

Haskell 有列表切片(即 Python)吗?

使用 Nix 的 callCabal2nix 时如何启用 Haskell 分析

Haskell分析中的星号含义?

编译器优化后如何分析 Haskell?