Haskell 如何强制ghc';s profiler更深入地了解库?
我正在尝试分析我的程序。因此,我使用Haskell 如何强制ghc';s profiler更深入地了解库?,haskell,profiling,ghc,Haskell,Profiling,Ghc,我正在尝试分析我的程序。因此,我使用-prof和-auto-all标志编译它,并使用-P运行以获得详细的分析报告: $ ghc --make -prof -auto-all Test.hs $ ./Test +RTS -P COST CENTRE MODULE no. entries %time %alloc main Main 266 1 0.0 0.0 run
-prof
和-auto-all
标志编译它,并使用-P
运行以获得详细的分析报告:
$ ghc --make -prof -auto-all Test.hs
$ ./Test +RTS -P
COST CENTRE MODULE no. entries %time %alloc
main Main 266 1 0.0 0.0
run Main 273 21845 99.3 99.7
sz Main 274 21844 0.0 0.0
size Main 268 21845 0.7 0.3
以下是一份分析报告:
$ ghc --make -prof -auto-all Test.hs
$ ./Test +RTS -P
COST CENTRE MODULE no. entries %time %alloc
main Main 266 1 0.0 0.0
run Main 273 21845 99.3 99.7
sz Main 274 21844 0.0 0.0
size Main 268 21845 0.7 0.3
似乎run
消耗了所有的时间和内存。它从各种库中调用了很多函数,我很确定大部分时间都花在其中一个库中,但我不知道是哪一个库。
我怎样才能得到更详细的报告?我希望手动放置大量的SCC
注释不是唯一的方法
更新。现在,我通过将库的源代码复制到我的程序目录来“解决”这个问题。这允许GHC将它们视为程序的一部分,而不是外部库。为了让探查器区分库函数,它们上必须有成本中心注释。您可以通过两种方式执行此操作:
-p-auto
重新编译感兴趣的库,以便使用SCC对库函数进行注释这是一个gprof类型的探查器- 您可以使用查找性能问题的方法与查找无限循环的方法相同,如下所示: 6.3 2007年11月21日格拉斯哥haskell用户的无限循环, 佩佩就这一问题提出了以下建议 检测无限循环的原因 GHCi。承担冒犯功能 名为
循环
,并取一个
论据:
1.启用标志-fbreak on error(:在GHCi中设置-fbreak on error
)
2.使用:trace运行表达式(:trace循环“a”
)
3.当程序卡在循环中时,点击Ctrl-C,调试器在循环中中断
4.使用:历史记录和:返回以找出回路的位置及其原因
任何性能问题和无限循环之间的唯一区别是——无限循环浪费100%的时间,而性能问题浪费更少的时间。
因此,您可能需要尝试几次。所有库都是通过
cabal安装来安装的——启用库评测。它和-p-auto不一样吗?不,它和-p一样。也就是说,这些库被编译以支持分析调用约定,但没有成本中心注释。我认为cabal install--enable可执行文件评测实际上会传递您需要的标志(不管名称如何),但我不能马上确定。谢谢链接。这项技术的有用性似乎是由于缺乏良好的分析工具(尤其是ghc)造成的。也许[VisualProf][1]能有所帮助?[1]: