Prérequis

Pour corréler des mesures à des emplacements dans le code source de l’application, perf report a besoin de comprendre la façon dont l’application s’exécute. En simplifiant un peu…

  • L’analyse sera relativement simple pour les programmes compilés avant l’exécution, le cas habituel en C/++, Fortran et Rust. Elle est basée sur les métadonnées des binaires ELF, communes à tous ces langages. Il faudra juste penser à compiler avec des informations de déboguage (flag -g de GCC et clang) pour des résultats optimaux.
  • Quand les programmes sont compilés à la volée, le cas habituel en Java, JavaScript et Julia, il faudra que perf puisse communiquer avec le compilateur pour obtenir les informatiques requises. Beaucoup de compilateurs populaires le permettent, mais souvent au prix d’une reconfiguration/recompilation avec des options spéciales qui ne sont pas activées dans les paquets binaires de la plupart des distributions Linux…
  • Et quand les programmes sont interprétés, le cas habituel en Python, Ruby et bash, on ne pourra souvent se rapporter qu’au code source de l’implémentation de l’interpréteur et des bibliothèques externes compilées statiquement, ce qui sera rarement satisfaisant.

Notez la répétition de l’expression “cas habituel” ci-dessus. Le modèle d’exécution n’est pas une propriété d’un langage, mais d’une implémentation de ce langage. On peut compiler du C++ à la volée comme le fait l’interpréteur cling de ROOT, tout comme on peut compiler du Python statiquement (Cython, Pythran) ou à la volée (Numba, PyPy). Mais la plupart des langages de programmation ont un type d’implémentation privilégié.

Par ailleurs, nous verrons plus loin que comme perf annotate et perf trace, perf report pourra effectuer une analyse plus fine si il dispose des informations de déboguage de l’application et de tous les binaires externes qu’elle utilise : noyau du système d’exploitation, bibliothèques…