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