2015-09-02 1 views
0

J'ai un problème avec un appel API très lent et je veux savoir, ce qu'il a causé, en utilisant Xhprof: l'interface graphique par défaut et le callgraph. Comment ces données devraient-elles être analysées?Comment identifier les goulots d'étranglement avec Xhprof?

Quelle est l'approche pour trouver les endroits dans le code, qui devraient être optimisés, et surtout les goulets d'étranglement les plus chers?

enter image description here

enter image description here

+0

Sortie profileur typique - vous inondant de bruit. Cochez [* ce message. *] (Http://stackoverflow.com/a/25870103/23771) Vous pouvez le traiter comme un bug et utiliser le débogueur PHP. Faites ensuite Ctrl-C ou Ctrl-Break pour l'interrompre et afficher la pile. Le problème sera sur la pile en proportion directe du temps qu'il faut. –

Répondre

1

De toutes ces colonnes, se concentrer sur celui qui est appelé "iWall%", colonne 5. Notez que send, doRequest, read et fgets ont chacun 72% inclus mur- temps d'horloge. Ce qui veut dire que si vous preniez 100 échantillons de piles, chacune de ces routines se trouverait sur 72 d'entre elles, donner ou prendre, et je soupçonne qu'elles apparaîtraient ensemble. (Votre graphique devrait le montrer aussi.)

Donc, puisque le tout prend 23 secondes, cela signifie que 17 secondes sont passées simplement à lire. La seule façon de réduire ces 17 secondes est si vous pouvez trouver qu'une partie de la lecture est inutile. Peut tu?

Qu'en est-il des 28% restants (6 secondes)? D'abord, est-ce que ça vaut le coup? Même si vous pouviez réduire cela à zéro (17 secondes au total, ce que vous ne pouvez pas), le facteur d'accélération serait de 1/(1-0,28) = 1,39, soit 39%. Si vous pouviez le réduire de moitié (20 secondes au total), ce serait 1/(1-0,14) = 1,16 ou 16%. 20 secondes contre 23, c'est à vous de décider si ça en vaut la peine.

Si vous le décidez, je recommande la méthode random pausing, car elle ne vous inonde pas de bruit. Cela va droit au cœur de la question, non seulement de vous dire quelles routines, mais aussi quelles lignes de code et pourquoi elles sont exécutées. (Le pourquoi est le plus important, parce que vous ne pouvez pas le remplacer si elle est absolument nécessaire. Avec profileurs, vous avez tendance à penser qu'il est nécessaire, parce que vous avez aucun moyen de dire le contraire.)

Puisque vous Si vous cherchez quelque chose qui prend environ 14% du temps, vous allez devoir examiner 2/0,14 = 14 échantillons, en moyenne, pour le voir deux fois, et cela vous dira ce que c'est. Gardez à l'esprit qu'environ 14 * 0,72 = 10 de ces échantillons vont atterrir en fgets (et tous ses appelants), donc vous pouvez les ignorer ou les utiliser pour vous assurer que toutes ces E/S sont vraiment nécessaires. (Par exemple, est-il simplement possible que vous lisiez des choses deux fois, pour une raison obscure comme si c'était plus facile de le faire?)