Профилирование высокопроизводительного кода Haskell - программирование
Подтвердить что ты не робот

Профилирование высокопроизводительного кода Haskell

У меня есть высокопроизводительный код Haskell - внутренний цикл составляет до 6 инструкций сборки. Изменение внутреннего цикла, чтобы быть менее эффективным, не оказывает заметного влияния на производительность, предполагая, что внутренний цикл не является узким местом. Однако, когда я включаю профилирование, код сборки, сгенерированный для внутреннего цикла, становится значительно менее эффективным, и профилировщик сообщает, что внутренний цикл занимает 85% времени.

Я подозреваю, что что-то не так медленно, но когда я использую профилирование, чтобы понять, что, я подозреваю, что профилирование делает внутренний цикл достаточно медленным, чем он доминирует. Какие методы я могу использовать, чтобы узнать, куда идет время? Профилировщик выборки был бы замечательным, если бы существовал для Haskell.

4b9b3361

Ответ 1

Вы можете использовать Linux perf events: 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

Если вы сохраняете ядро ​​при компиляции, вы можете сопоставить эти символы с функциями в ядре.

Немного больно, но дает вам более надежные результаты.

Для этого нужно выполнить некоторую работу.