J'essaie de mesurer le temps nécessaire pour exécuter un morceau de code sur mon serveur de production. J'aimerais surveiller ces informations en temps réel. J'ai donc décidé de donner à la performance analyseur A Whiz. Je comprends de MSDN que j'ai besoin de créer à la fois Un AVERAGETIMER32 et un compteur de performance en moyenne enBase, que j'ai dûment. J'y incrémente le comptoir dans mon programme et je peux voir que le callcount mine de haut en bas, mais l'Averagetime est toujours nulle. Qu'est-ce que je fais mal?
Voici un snippage de code: p>
3 Réponses :
Tout d'abord, la fixation des compteurs de performance est assez chère, vous devriez donc essayer de garder les instances globales à leur vivre au lieu d'ouvrir et de les fermer à chaque fois. P>
Vous semblez avoir la bonne idée, c'est à peu près ce que nous faisons dans notre code de surveillance de la performance. Cependant, nous ne faisons pas .nextValue immédiatement avant de les mettre à jour - donc j'essayerais d'arrêter de faire cela initialement. P>
Êtes-vous également sûr que Environnement.TickCount - init_call_time n'est pas une si petite période de temps qu'il évalue à 0? Environnement.TickCount n'a pas une excellente résolution, la classe System.Diagnostics.StopWatch a une bien meilleure précision. P>
>> Vous devriez essayer de garder les cas mondiaux comment suggéreriez-vous de le faire dans une application Web? Devrais-je peut-être ajouter du code à Application_Start pour instancier les comptoirs et les stocker dans une variable d'application?
L'heure d'exécution moyenne est d'environ 1,5 seconde - 3 secondes selon que je suppose que cela est suffisamment long pour l'environnement. Cependant, je vais essayer la montre d'arrêt.
En supposant que vous n'êtes pas multi-fileté, cela devrait être
// cached somewhere
var perf2 = new PerformanceCounter("Cat", "CallTime", "Instance", false);
[ThreadStatic]
Stopwatch sw;
// where ever you are setting init_call_time
if (sw == null)
sw = new Stopwatch();
sw.Start();
// then when the task has finished
sw.Stop();
perf2.IncrementBy(sw.ElapsedMilliseconds); // or tick, whatever you want to use
sw.Reset();
Ceci est une application ASP.NET hébergée dans IIS, de sorte que RAWVALUE est toujours une bonne idée?
Vous voudriez utiliser l'incrément de réinitialisation de la montre d'arrêt à chaque fois et avoir une chronomètre par fil (le fil statique ferait)
AVERAGETIMER32 incréments du temps écoulé entre deux appels et les incréments de la Moyennebase de 1 pour chaque opération prise. p>
Voici une documentation de la performanceCounterType. http://msdn.microsoft.com/en-us/ bibliothèque / system.diagnostics.performancecountertype.aspx p>
Et voici une autre ressource: http://www.codeproject.com/kb/dotnet/perfcounter.aspx p>