分析高性能Haskell代码
我有一些高性能的Haskell代码 – 内部循环编译为6个汇编指令。 内环效率低下对性能没有明显的影响,说明内环不是瓶颈。 但是,打开性能分析时,为内部循环生成的汇编代码效率会大大降低,而且性能分析器报告内部循环占用了85%的时间。
我怀疑有些东西是不必要的慢,但是当我使用剖析来看看,我怀疑剖析使内部循环足够慢,以至于它占主导地位。 我可以用什么技术来看看时间在哪里? 如果一个Haskell存在的话,一个采样分析器将会非常棒。
您可以使用Linux perf事件: 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
如果在编译时保存核心,则可以将这些符号映射回核心中的函数。
有点痛苦,但给你更可靠的结果。
有一些工作正在自动完成。