在 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 分析时排除开销的主要内容,如果未能解决你的问题,请参考以下文章