【问题标题】:Profiling high-performance Haskell code分析高性能 Haskell 代码
【发布时间】:2014-01-19 19:06:51
【问题描述】:

我有一些高性能的 Haskell 代码——内部循环编译成 6 条汇编指令。修改内部循环以降低效率不会对性能产生任何明显影响,这表明内部循环不是瓶颈。但是,当我打开分析时,为内部循环生成的汇编代码的效率会大大降低,并且分析器报告说内部循环占用了 85% 的时间。

我怀疑某些东西是不必要的慢,但是当我使用分析来查看什么时,我怀疑分析使内部循环足够慢以至于它占主导地位。我可以使用什么技术来查看时间的去向?如果 Haskell 存在采样分析器,那将是很棒的。

【问题讨论】:

  • 如果您手动添加成本中心,您可能无法将成本中心添加到该循环中,因此它不会变慢?不知道这是否有效
  • 好主意,但它似乎不起作用。即使根本没有成本中心,只需添加 -prof 就会在内部循环中添加一个 call enterFunCCS 以及大约 5 个其他附加指令(但 call 将是杀死它的那个)。
  • 我有一些用于采样的技巧。基本上,您只需链接分析启动代码。问题是生成的 .prof 文件使 gprof 死掉了。可能是因为 gprof 对符号有一些假设。但是一个知道 ghc 符号的破解 gprof 应该能够工作。
  • 可以注释掉循环吗?这样您就可以分析其余代码,而不会让循环弄乱配置文件。
  • 也许您可以尝试使用“ticky-ticky”分析:ghc.haskell.org/trac/ghc/wiki/Debugging/TickyTicky(我没有这样做的经验,只是在 GHC wiki 上偶然发现)

标签: haskell assembly profiling


【解决方案1】:

您可以使用 Linux 性能事件:https://ghc.haskell.org/trac/ghc/wiki/Debugging/LowLevelProfiling/Perf

这将为您提供如下所示的输出:

# Samples: 9161149923
#
# Overhead  Command      Shared Object  Symbol
# ........  .......  .................  ......
#
    30.65%   queens  queens             [.] s1ql_info
    18.67%   queens  queens             [.] s1qj_info
    12.17%   queens  queens             [.] s1qi_info
     9.94%   queens  queens             [.] s1o9_info
     5.85%   queens  queens             [.] r1nI_info
     5.33%   queens  queens             [.] s1sF_info
     5.18%   queens  queens             [.] s1sG_info
     3.69%   queens  queens             [.] s1oP_info
     1.68%   queens  queens             [.] stg_upd_frame_info
     0.88%   queens  queens             [.] stg_ap_2_upd_info
     0.62%   queens  queens             [.] s1sE_info
     0.56%   queens  [kernel]           [k] read_hpet
     0.39%   queens  queens             [.] stg_ap_p_info
     0.35%    :2030             f76beb  [.] 0x00000000f76beb
     0.31%   queens  queens             [.] s1oD_info
     0.28%  swapper  [kernel]           [k] mwait_idle_with_hints
     0.25%   queens  queens             [.] __stg_gc_enter_1
     0.23%   queens  queens             [.] evacuate
     0.18%  swapper  [kernel]           [k] read_hpet
     0.12%   queens  queens             [.] scavenge_block

如果在编译时保存内核,则可以将这些符号映射回内核中的函数。

有点痛苦,但会给你更值得信赖的结果。

有一些工作可以自动完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2013-01-12
    相关资源
    最近更新 更多