我正试图介绍我的程序。因此,我使用-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
似乎run
消耗所有时间和记忆。它从各种库中调用了很多函数,我很确定大部分时间花在其中一个库中,但我无法确定哪一个。
我怎样才能获得更详细的报告?我希望手动放置大量SCC
注释不是唯一的方法。
更新即可。现在我通过将库的源代码复制到我的程序目录来“解决”了这个问题。这允许GHC将它们视为程序的一部分,而不是外部库。
答案 0 :(得分:4)
要使分析器区分库函数,必须对它们进行成本中心注释。你可以这两种方式:
-p -auto
重新编译感兴趣的库,以便使用SCC对库函数进行注释。答案 1 :(得分:1)
这是一个gprof类型的探查器 - pretty weak, for these reasons.
您可以使用GHCi查找性能问题,就像以这种方式找到无限循环by this technique一样:
6.3无限循环在2007年11月21日的glasgow-haskell用户上, 佩佩提出以下建议 检测原因无限循环 GHCI。假设违规功能 被命名为
loop
,并取一个 论点:1.启用标志-fbreak-on-error(GHCi中的
:set -fbreak-on-error
)2.用你的表达式:trace(
:trace loop 'a'
)3.当程序卡在循环中以使调试器在循环中中断时,按Ctrl-C
4.use:history and:返回查找循环所在的位置以及原因。
任何性能问题和无限循环之间的唯一区别是 - 无限循环浪费100%的时间,而性能问题浪费的百分比较低。 所以你可能不得不闯入它几次。