Question

Le profilage du code crissement numéro C ++ à la fois gprof et kcachegrind donne des résultats similaires pour les fonctions qui contribuent le plus au temps d'exécution (50-80% selon l'entrée), mais pour les fonctions entre 10-30% ces deux outils donnent des résultats différents . Est-ce que cela signifie un d'entre eux n'est pas fiable? Que voulez-yo faire ici?

Était-ce utile?

La solution

gprof est en fait assez primitive. Voici ce qu'il fait. 1) Il échantillonne le compteur de programme à un taux constant et enregistre la façon dont la terre dans chaque fonction (le temps exclusif d'échantillons). 2) Il compte combien de fois une fonction A appelle une fonction B. A partir de ce qu'il peut savoir combien de fois chaque fonction a été appelée au total, et ce qu'il est temps exclusif moyen était. Pour obtenir le temps moyen compris fonction dans laquelle il se propage vers le haut dans le temps exclusif le graphe d'appel.

Si vous attendez que cela ait une sorte de précision, vous devriez être au courant de certaines questions. Tout d'abord, il ne compte que CPU-temps en cours, ce qui signifie qu'il est aveugle à E / S ou d'autres appels système. En second lieu, récursivité confond. En troisième lieu, le principe selon lequel les fonctions adhèrent toujours à un moment de l'exécution moyenne, peu importe quand ils sont appelés ou qui les appelle, est très suspect. En avant, l'idée que les fonctions (et leur graphe d'appel) sont ce que vous devez savoir sur, plutôt que des lignes de code, est tout simplement une hypothèse populaire, rien de plus. Cinquièmement, la notion que la précision de la mesure est encore pertinents pour trouver « goulots d'étranglement » est juste une croyance populaire, rien de plus.

Callgrind peut travailler au niveau des lignes - c'est bon. Malheureusement, il partage les autres problèmes.

Si votre objectif est de trouver des « goulots d'étranglement » (par opposition à obtenir des mesures générales), vous devriez jeter un oeil à la pile de temps horloge murale échantillonneurs ce rapport pour cent par ligne, tels que Zoom . La raison est simple mais peut-être pas familier.

Supposons que vous ayez un programme avec un tas de fonctions qui s'appellent qui prend un total de 10 secondes. En outre, il y a un échantillonneur que des échantillons, non seulement le compteur de programme, mais l'ensemble de la pile d'appel, et il le fait tout le temps à un taux constant, comme 100 fois par seconde. (Ignorer les autres processus pour l'instant.)

Donc, à la fin vous avez 1000 échantillons de la pile d'appels. Choisissez une ligne de code L qui apparaît sur plus d'un d'entre eux. Supposons que vous pourriez en quelque sorte d'optimiser cette ligne, en l'évitant, l'enlever ou le faire passer pour un processeur vraiment très rapide.

Que se passerait-il à ces échantillons?

Depuis cette ligne de code L prend maintenant (essentiellement) un rien de temps, aucun échantillon ne peut frapper, de sorte que ces échantillons seraient simplement disparaissent , ce qui réduit le nombre total d'échantillons, et par conséquent le total temps! En fait, le temps global serait réduit de la fraction de temps L a été mis sur la pile, ce qui est à peu près la fraction des échantillons qui contenaient ce.

Je ne veux pas trop statistiques, mais beaucoup de gens pense que vous avez besoin de beaucoup d'échantillons, parce qu'ils pensent que la précision de la mesure est importante. Il n'est pas, si la raison pour laquelle vous faites est de savoir ce qu'il faut corriger pour obtenir gain de vitesse. L'accent est mis sur trouver ce qu'il faut corriger, pas mesure il. La ligne L est sur la pile une fraction F du temps, non? Donc, chaque échantillon a une probabilité F de frapper, non? Tout comme lancer une pièce. Il y a une théorie de ce fait, appelé Règle de succession . Il dit que (en simplifiant, mais hypothèses générales), si vous retournez une pièce de monnaie N fois, et voir « têtes » S fois, vous pouvez estimer l'équité de la médaille F comme (en moyenne) (S+1)/(N+2). Donc, si vous prenez aussi peu que trois échantillons, et voir L sur deux d'entre eux, vous savez ce que F est? Bien sûr que non. Mais vous ne connaissez en moyenne, il est (2 + 1) / (3 + 2) ou 60% . Alors que de combien de temps vous pourriez économiser (en moyenne) par une ligne « optimisation de loin » L. Et, bien sûr, les échantillons de cheminée vous a montré exactement où la ligne L (le « goulot d'étranglement » **) est. Est-ce que ce vraiment that que vous ne mesurez pas à deux ou trois décimales?

BTW, il est à l'abri de tous les autres problèmes mentionnés ci-dessus .

** Je continue à mettre des guillemets autour de « goulot d'étranglement », car ce qui rend la plupart des logiciels a lent rien en commun avec le goulot d'une bouteille. Une meilleure métaphore est une « fuite » -. Quelque chose que les déchets tout temps inutilement

scroll top