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对库函数进行注释
  • 在代码中围绕可能耗时的库调用插入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]: