Profilage du code Haskell haute performance

J’ai un code Haskell très performant – la boucle interne se comstack en 6 instructions d’assemblage. Modifier la boucle interne pour qu’elle soit moins efficace n’a pas d’impact significatif sur les performances, ce qui suggère que la boucle interne n’est pas le goulot d’étranglement. Cependant, lorsque j’active le profilage, le code d’assembly généré pour la boucle interne devient considérablement moins efficace et l’éditeur de profil signale que la boucle interne prend 85% du temps.

Je soupçonne que quelque chose est inutilement lent, mais quand j’utilise le profilage pour voir quoi, je soupçonne que le profilage rend la boucle interne suffisamment lente pour dominer. Quelles techniques puis-je utiliser pour voir où le temps passe? Un profileur d’échantillonnage serait génial, s’il en existait un pour Haskell.

    Vous pouvez utiliser les événements de perf 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 kernel pendant que vous comstackz, vous pouvez redirect ces symboles vers les fonctions du kernel.

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

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