如何强制ghc的分析器深入图书馆?

时间:2011-03-04 17:06:34

标签: 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                   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将它们视为程序的一部分,而不是外部库。

2 个答案:

答案 0 :(得分:4)

要使分析器区分库函数,必须对它们进行成本中心注释。你可以这两种方式:

  1. 使用-p -auto重新编译感兴趣的库,以便使用SCC对库函数进行注释。
  2. 在代码中插入可能耗时的库调用的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%的时间,而性能问题浪费的百分比较低。 所以你可能不得不闯入它几次。