2009-12-10 21 views
6

Dites que j'ai une méthode Foo() et que je veux mesurer le temps en millisecondes qu'il a fallu pour exécuter quel type de compteur de performance Windows devrais-je utiliser?Quel est le type de compteur de performance le plus approprié pour mesurer le temps de fonctionnement?

var stopwatch = new Stopwatch(); 
stopwatch.Start(); 
Foo(); 
stopwatch.Stop(); 
counter.RawValue = stopwatch.TotalMilliseonds; 

Actuellement, je suis en utilisant NumberOfItems64 mais qui persiste la dernière valeur du compteur à moins que la nouvelle opération est effectuée. Est-ce souhaitable? Ou le compteur devrait-il être remis à zéro dès que l'opération est terminée? Quel type de compteur choisiriez-vous dans cette situation et pourquoi?

Répondre

7

Cela sonne comme un bon candidat pour AverageTimer32. Voir this SO answer pour plus de détails.

+0

Bien que je ne veux pas faire la moyenne du temps à travers différents appels. –

+0

Vous ne pouvez pas vraiment faire beaucoup d'autres choses, car que voulez-vous enregistrer pour les demandes simultanées? –

0

J'utilise normalement Chronomètre, mais j'ai aussi utilisé p/invoquer pour kernel32.dll:

[DllImport("Kernel32.dll")] 
    private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); 

    [DllImport("Kernel32.dll")] 
    private static extern bool QueryPerformanceFrequency(out long lpFrequency); 

J'ai deux méthodes appelées Start() et Stop():

public void Start() 
    { 
    Thread.Sleep(0); 
    QueryPerformanceCounter(out startTime); 
    } 


    public void Stop() 
    { 
    QueryPerformanceCounter(out stopTime); 
    } 

Pour interroger la durée entre les appels à démarrer() et Stop():

public double Duration 
    { 
    get 
    { 
     return (double)(stopTime - startTime)*1000/(double)freq; 
    } 
    } 

Notez que freq est déterminée en constructeur:

public PerformanceTimer() 
    { 
    startTime = 0; 
    stopTime = 0; 

    if (QueryPerformanceFrequency(out freq) == false) 
    { 
     // not supported 
     throw new Win32Exception(); 
    } 
    } 

Pour mes besoins, je n'ai pas remarqué une grande différence, bien que je vous suggère d'essayer les deux pour voir ce qui vous convient.

Modifier: J'ai été en mesure de localiser le original code from MSDN. Il semble qu'il y ait quelques améliorations depuis .Net 1.1. Le message à retenir est que Microsoft prétend que cette méthode fournit une précision de la nanoseconde.

+0

Le chronomètre utilise aussi QueryPerformanceCounter. Mais question pas sur la façon de mesurer l'intervalle de temps. Il sur la façon de persister une valeur mesurée pour analyse ultérieure. – user1295211

1

Pour ajouter à la réponse précédente, il y a un very good article sur les deux compteurs de performance pré-faites et sur mesure sur CodeProject ..

0

Une réponse et une question:

Réponse: L'activité basse technologie pour moi. Vous voulez des microsecondes? Bouclez-le 10^6 fois et utilisez votre montre. Question: Demandez-vous parce que vous voulez rendre votre code plus rapide? Puis consider this.