Pourquoi gprof sous-estime-t-il considérablement la durée d’exécution du programme?

J’ai ce programme qui prend 2,34 secondes à exécuter et gprof dit que cela ne prend que 1,18 secondes. J’ai lu ailleurs des réponses suggérant que gprof peut se tromper si, par exemple, le programme est lié à l’entrée / sortie, mais ce programme ne l’est clairement pas.

Cela se produit également pour un programme utile que j’essaie de profiler. Ce n’est pas spécifique à ce cas de test sortingvial.

(Dans ce cas également, gprof dit que main () prend plus de 100% du temps d’exécution du programme, ce qui est un bogue assez stupide mais qui ne me pose pas vraiment de problèmes.)

$ cat test.c int main() { int i; for (i=0;i<1000000000;i++); } $ gcc test.c -o test $ time ./test real 0m2.342s user 0m2.340s sys 0m0.000s $ gcc test.c -o test -pg $ time ./test real 0m2.342s user 0m2.340s sys 0m0.000s $ gprof test |head Flat profile: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls Ts/call Ts/call name 101.33 1.18 1.18 main % the percentage of the total running time of the time program used by this function. 

    Je recommanderais de supprimer gprof et de passer à oprofile . Tout profilage insérant une instrumentation dans votre programme affectera de manière inhérente les performances de manière à fausser ou à invalider les résultats. Avec oprofile vous n’avez pas besoin de créer votre programme avec la prise en charge du profilage ou d’obtenir des bibliothèques spéciales activées pour le profilage; cela fonctionne par des méthodes statistiques, en échantillonnant le pointeur d’instruction (avec l’aide du kernel) et en utilisant le nombre d’échantillons pour estimer le temps passé dans chaque fonction.

    Premièrement, pour répondre à votre question, gprof ne compte pas le temps bloqué. Par conséquent, si quelque chose se passe dans la machine en même temps, vous verrez cette différence. De plus, si votre programme effectue des E / S, elles ne seront pas comptabilisées non plus.

    gprof n’est utile que pour une classe de programmes très restreinte. Voici une liste des problèmes.

    Tout d’abord, le profilage d’un programme qui se termine en 2,3 secondes est un peu ridicule. Vous avez vraiment besoin d’un programme à long terme pour bien mesurer les points chauds du programme, etc. Mais je m’éloigne du sujet …

    Pour répondre à votre première question, time (l’utilitaire de ligne de commande) multiplie par l’exécution de l’ensemble du processus (y compris l’instrumentation de profilage elle-même). Lorsque vous activez le profilage dans votre construction, le programme écrit un fichier gmon.out contenant les temps d’exécution, etc. à chaque fois que vous exécutez le programme. C’est-à-dire que le travail difficile de profilage est effectué chaque fois que vous exécutez le programme. L’instrumentation de profilage s’efforce de séparer son propre impact sur la comptabilisation du temps, et dans ce cas, il semble que le profilage lui-même a représenté 2,34 – 1,18 = 1,16s du temps d’exécution (comme indiqué par le temps). Le programme gprof lui-même consiste essentiellement à parsingr et à reformater les statistiques d’exécution stockées dans le programme gmon.out. Pour être clair à ce sujet, le véritable profilage se produit lors de l’exécution de votre programme, pas lors de l’exécution de gprof.

    Enfin, la sortie gprof répond directement à votre deuxième question. Il échantillonne l’exécution de votre programme au 1/100 s. intervalles et donne crédit pour ces 0,01 secondes à tout ce qui s’est passé pendant l’exécution de l’échantillon. Si votre programme ne prend pas un multiple exact de 0,01 seconde à exécuter, vous obtiendrez des nombres qui ne totalisent pas 100%. Là encore, il convient de souligner que le profilage d’un programme qui s’exécute aussi rapidement est sujet à des erreurs et que ce bogue apparent serait certainement atténué par un intervalle d’échantillonnage plus long (par exemple, le temps d’exécution). En outre, la comptabilisation de ses propres frais généraux par gprof est imparfaite, ce qui pourrait encore consortingbuer au chiffre apparemment ridicule de 101,33%.

    C’est un processus statistique, et ce n’est pas parfait. Vous devez interpréter les résultats avec un grain de sel.

    Bonne chance!