2010-03-17 8 views
2

Je suis en train de mettre en œuvre des instruments dans une application et j'ai rencontré un problème où la valeur affichée dans Windows Performance Monitor d'un PerformanceCounter est incompatible avec la valeur enregistrée. J'utilise un chronomètre pour enregistrer la durée d'exécution d'une méthode, puis j'inscrive d'abord le total des millisecondes en double, et ensuite je passe le TimeSpan du chronomètre. J'écris le PerformanceCounter pour l'enregistrer dans le moniteur de performances.Valeurs de temporisateur de compteur de performance inexactes dans Windows Performance Monitor

Création des compteurs de performance dans perfmon:

var datas = new CounterCreationDataCollection(); 
datas.Add(new CounterCreationData 
{ 
    CounterName = name, 
    CounterType = PerformanceCounterType.AverageTimer32 
}); 

datas.Add(new CounterCreationData 
{ 
    CounterName = namebase, 
    CounterType = PerformanceCounterType.AverageBase 
}); 

PerformanceCounterCategory.Create("Category", "performance data", 
    PerformanceCounterCategoryType.SingleInstance, datas); 

ensuite pour enregistrer i récupérer un compteur pré-initialisation à partir d'une collection et l'incrément:

_counters[counter].IncrementBy(timing); 
_counters[counterbase].Increment(); 

... où "timing" est La valeur TimeSpan.Ticks du chronomètre. Lorsque cela fonctionne, la collection de doubles, qui sont les valeurs en millisecondes pour TimeSpan du Stopwatch, montre un ensemble de valeurs, mais ce qui apparaît dans PerfMon est un ensemble de valeurs différent.

Par exemple ... deux valeurs enregistrées dans la liste des millisecondes sont:

23322,675, 14230,614

Et ce qui apparaît dans le graphique PerfMon sont:

15,546, 9,930

Can quelqu'un explique cela s'il vous plaît?

+0

@krisg - pouvez-vous afficher le code qui place les entrées dans la liste des millisecondes? –

Répondre

2

Quelques suppositions. Vous utilisez PerformanceCounterType.AverageTimer32. Cela prend une moyenne du temps. Il est également possible que vous ne réinitialisiez pas le Stopwatch à chaque appel de méthode, de sorte que les valeurs que vous stockez dans la liste correspondent à la durée totale écoulée jusqu'à présent de chaque appel à cette méthode.

Vous avez indiqué des millisecondes pour la liste, mais des coches pour le compteur de performance. Une coche est de 100 nanosecondes, soit 0,0001 milliseconde. Je m'attendais à ce que les tailles que vous deviez être inversées comme perfmon obtenant 14230.614 et la liste obtenant 15.546 mais ce serait encore outre d'un ordre de grandeur.

Pas beaucoup d'une réponse, mais il ne rentrait pas dans un commentaire.

+0

haha ​​non ce n'est pas le chronomètre: P – krisg

+0

Il suffit de lire ceci ici: http://www.codeproject.com/KB/system/monitorserviceperformance.aspx qui indique que AverageTimer32 génère une valeur dans PerfMon en faisant la moyenne des 2 dernières valeurs enregistrées . C'est probablement la cause du problème avec des valeurs différentes. En ce qui concerne l'ordre de grandeur, je devine que si vous passez le temps de PerfMon en ticks, il l'affiche dans un format plus "humain-amical" des secondes. C'est juste une supposition cependant. – krisg

+0

Marqué comme réponse de toute façon car il m'a fourni au moins un minimum d'illumination;) – krisg

Questions connexes