分析高性能Haskell代码

分析高性能Haskell代码,haskell,assembly,profiling,Haskell,Assembly,Profiling,我有一些高性能的Haskell代码-内部循环编译多达6条汇编指令。将内部循环修改为效率较低不会对性能产生任何明显影响,这表明内部循环不是瓶颈。但是,当我打开分析时,为内部循环生成的汇编代码的效率会大大降低,并且分析程序报告内部循环占用了85%的时间 我怀疑某些东西的速度太慢了,但当我使用分析来了解情况时,我怀疑分析会使内部循环变得足够慢,以至于占主导地位。我可以使用什么技术来了解时间的走向?如果Haskell有一个采样探查器,那么它将非常棒。您可以使用Linux性能事件: 这将为您提供如下输出:

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


我怀疑某些东西的速度太慢了,但当我使用分析来了解情况时,我怀疑分析会使内部循环变得足够慢,以至于占主导地位。我可以使用什么技术来了解时间的走向?如果Haskell有一个采样探查器,那么它将非常棒。

您可以使用Linux性能事件:

这将为您提供如下输出:

# 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
如果在编译时保存core,则可以将这些符号映射回core中的函数

有点痛苦,但会给你更可靠的结果


有一些工作正在自动完成。

如果您手动添加成本中心,您可能无法将成本中心添加到该循环中,因此不会变慢?我不确定这是否行得通,虽然是个好主意,但似乎行不通。即使根本没有成本中心,只要添加
-prof
就可以将
调用enterfuncs
放入内部循环,再加上大约5条其他指令(但
调用
将杀死它)。我有一些做采样的技巧。基本上,您只需链接分析启动代码。问题是生成的.prof文件使gprof失效。可能是因为gprof对符号有一些假设。但是一个知道ghc符号的被黑客攻击的gprof应该能够工作。有可能注释掉这个循环吗?这样,您就可以分析其余的代码,而不会让循环弄乱配置文件。也许您可以尝试使用“ticky-ticky”分析:(我没有这样做的经验,只是在GHC wiki上偶然发现了它)