48 votes

Profilage du code Haskell hautes performances

J'ai quelques haute performance code Haskell - la boucle interne compile jusqu'à 6 instructions de montage. La modification de la boucle intérieure pour être moins efficaces n'ont pas d'impact notable sur les performances, ce qui suggère que la boucle interne n'est pas le goulot d'étranglement. Cependant, quand je me tourne sur le profilage, le code assembleur généré pour la boucle interne devient considérablement moins efficace, et les profils signale que la boucle interne prend 85% du temps.

Je soupçonne que quelque chose est inutilement lent, mais quand j'utilise le profilage afin de voir ce qui, je soupçonne que le profilage fait la boucle interne suffisamment lente qu'elle domine. Quelles sont les techniques que je peux utiliser pour voir où le temps s'en va? Un profileur d'échantillonnage serait génial, si il y en avait pour Haskell.

24voto

tibbe Points 3790

Vous pouvez utiliser les événements de performance Linux: https://ghc.haskell.org/trac/ghc/wiki/Debugging/LowLevelProfiling/Perf

Cela vous donnera une sortie qui ressemble à:

 # 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
 

Si vous enregistrez le noyau lors de la compilation, vous pouvez associer ces symboles aux fonctions du noyau.

Un peu douloureux, mais vous donne des résultats plus fiables.

Il y a du travail à faire pour le faire automatiquement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X