web-dev-qa-db-fra.com

Calculer le temps d'exécution d'une méthode

Dupliquer possible: 
Comment mesurer la durée d'exécution d'une fonction?

J'ai une méthode de prise de temps d'E/S qui copie les données d'un emplacement à un autre. Quel est le meilleur moyen de calculer le temps d’exécution? Thread? Timer? Stopwatch? Une autre solution? Je veux le plus exact et le plus bref possible.

423
Mahdi Tahsildari

Stopwatch est conçu à cet effet et constitue l’un des meilleurs moyens de mesurer le temps d’exécution dans .NET.

var watch = System.Diagnostics.Stopwatch.StartNew();
// the code that you want to measure comes here
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

Ne pas utiliser DateTime pour mesurer le temps d'exécution en .NET.


METTRE À JOUR:

Comme l'a souligné @ series0ne dans la section commentaires: Si vous souhaitez obtenir une mesure précise de l'exécution de certains codes, vous devez utiliser les compteurs de performance intégrés au système d'exploitation. Le réponse suivante contient un aperçu de Nice.

865
Darin Dimitrov

D'après l'expérience personnelle, la classe System.Diagnostics.Stopwatch peut être utilisée pour mesurer le temps d'exécution d'une méthode, cependant, MÉFIEZ-VOUS: ce n'est pas tout à fait exact!

Considérons l'exemple suivant:

Stopwatch sw;

for(int index = 0; index < 10; index++)
{
    sw = Stopwatch.StartNew();
    DoSomething();
    Console.WriteLine(sw.ElapsedMilliseconds);
}

sw.Stop();

Exemple de résultats

132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms

Maintenant vous vous demandez; "pourquoi a-t-il fallu 132 ms la première fois et beaucoup moins le reste du temps?"

La réponse est que Stopwatch ne compense pas l'activité "de bruit de fond" dans .NET, telle que JIT. Par conséquent, la première fois que vous exécutez votre méthode, .NET JIT. Le temps nécessaire pour le faire est ajouté au moment de l'exécution. De même, d'autres facteurs entraîneront une variation du temps d'exécution.

Ce que vous devriez vraiment rechercher pour une précision absolue, c'est Performance Profiling!

Regardez ce qui suit:

RedGate ANTS Performance Profiler est un produit commercial, mais produit des résultats très précis. - Améliorez les performances de vos applications avec le profilage .NET

Voici un article de StackOverflow sur le profilage: - Quels sont certains bons profileurs .NET?

J'ai également écrit un article sur le profilage des performances à l'aide de chronomètre que vous voudrez peut-être consulter - Profilage des performances dans .NET

61
series0ne

StopWatch class recherche votre meilleure solution.

Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);

En outre, il possède un champ statique appelé Stopwatch.IsHighResolution . Bien entendu, il s’agit d’un problème de matériel et de système d’exploitation.

Indique si le minuteur est basé sur une performance haute résolution compteur.

24
Soner Gönül

Si vous souhaitez comprendre les performances, la meilleure solution consiste à utiliser un profileur.

Sinon, System.Diagnostics.StopWatch fournit un minuteur haute résolution.

17
Jeff Foster

Chronomètre utilisera le compteur haute résolution

Le chronomètre mesure le temps écoulé en comptant les ticks du minuteur dans le mécanisme de minuterie sous-jacent. Si le matériel installé et en fonctionnement système prend en charge un compteur de performance haute résolution, puis le La classe Stopwatch utilise ce compteur pour mesurer le temps écoulé. Autrement, la classe Chronomètre utilise le temporisateur système pour mesurer le temps écoulé. Utilisation les champs Fréquence et IsHighResolution pour déterminer la précision et résolution de la mise en œuvre du chronométrage.

Si vous mesurez IO, vos chiffres seront probablement affectés par des événements extérieurs, et je craindrais beaucoup. exactitude (comme vous l'avez indiqué ci-dessus). Au lieu de cela, je prendrais une gamme de mesures et considérerais la moyenne et la distribution de ces chiffres.

7
Brian Agnew
 using System.Diagnostics;
 class Program
 {
    static void Test1()
    {
        for (int i = 1; i <= 100; i++)
        {
            Console.WriteLine("Test1 " + i);
        }
    }
  static void Main(string[] args)
    {

        Stopwatch sw = new Stopwatch();
        sw.Start();
        Test1();
        sw.Stop();
        Console.WriteLine("Time Taken-->{0}",sw.ElapsedMilliseconds);
   }
 }
0
RAKIBUZ SULTAN PRANTO

J'ai utilisé la propriété Environment.TickCount à cette fin.

int start = Environment.TickCount;
// Your code here...
int end = Environment.TickCount;
int diffInMilliseconds = end - start;
0