Disons que j'ai un programme artificiel:Comment localiser le temps d'inactivité (et l'heure d'E/S du réseau, etc.) dans XPerf?
#include <Windows.h>
void useless_function()
{
Sleep(5000);
}
void useful_function()
{
// ... do some work
useless_function();
// ... do some more work
}
int main()
{
useful_function();
return 0;
}
Objectif: Je veux que le profileur pour me dire useful_function()
appelle inutilement useless_function()
qui attend aucune raison évidente. Sous XPerf, cela n'apparaît dans aucun des graphiques que j'ai parce que l'appel à WaitForMultipleObjects()
semble être comptabilisé à Idle.exe
au lieu de mon propre programme.
Et voici la ligne de commande XPerf que je dirige actuellement:
xperf -on Latency -stackwalk Profile
Toutes les idées?
(Ce ne se limite pas à attendre les fonctions. Ci-dessus aurait pu être résolu en plaçant des points d'arrêt à NtWaitForMultipleObjects
. Pourrait être idéal il un moyen de voir l'échantillon de pile qui est prend beaucoup de temps-horloge murale par opposition à seulement le temps CPU)
Merci Mike. J'ai lu beaucoup de vos articles sur la technique du "sampling manuel". C'est vraiment utile. D'autre part, Windows XPerf est un excellent outil pour profiler les programmes - il a une trace de pile pour l'E/S sur disque, les changements de contexte et ** l'utilisation du tas **, etc. L'horloge murale IMO est la seule pièce manquante. sinon outil gratuit complet. BTW le site officiel de LTProf semble être en panne pour le moment: P – kizzx2
@ kizzx2: Oui, pour l'utilisation du tas, je n'ai pas d'opinion cohérente. Si je rencontre un aspect négatif sur xperf (et d'autres outils), je ne le souhaite vraiment pas, mais j'essaie de faire la lumière sur ce qui doit être réparé et pourquoi. Pour LTProf, j'ai acheté une copie, car il semblait que tout ce qu'il y avait de mieux en dessous. Ensuite, j'ai trouvé 1) vous ne pouvez pas l'étrangler manuellement dans une application d'interface utilisateur, et 2) pour la présentation, ils donnent le pourcentage par fonction, et le pourcentage de ligne est relatif à la fonction. Donc, si vous voulez connaître le pourcentage réel, vous devez multiplier ces deux. Ensuite, il reste la question de rendre les échantillons visibles. –
@ kizzx2: ... Ce dernier point est probablement quelque chose de fondamental, et je me sens vraiment à ce sujet. C'est la différence entre simplement mesurer les choses et comprendre réellement pourquoi le programme passe certaines fractions de son temps. Je vois des piles 30 couches de profondeur et elles semblent totalement confuses, mais si je prends le temps de le lire et de regarder le code à différents niveaux, et les données, alors je peux vraiment comprendre si ce qu'il fait * doit être fait, et c'est la clé. –