Stopwatch : mesurez le temps d’exécution de votre code

Le 17 septembre 2009 à 09:00

En développement, il existe une multitude de possibilités d’une opération pour arriver au même résultat final. Outre la « technicité » du développement, le critère des performances est un élément important à prendre en compte. La meilleure mesure dans ce cas est celle du temps.

Avec le Framework .NET, il existe la classe Stopwatch. Cette classe, existante depuis la version 2 du Framework et présente dans l’espace de nom « System.Diagnostics », permet de mesurer l’intervalle de temps effectuée par une ou plusieurs opérations données. Son utilisation est très simple, et sa précision est de l’ordre de la microseconde.

Sa mise en place est très simple, dans l’exemple suivant, on affiche l’intervalle écoulé pour l’exécution du code entre stopWatch.Start() et stopWatch.Stop(), c'est-à-dire l’instanciation de la variable List et l’exécution de la boucle for :

Stopwatch stopWatch = new Stopwatch();  
stopWatch.Start(); // Démarre le chronomètre  
              
List<int> list = new List<int>();  
             
for (int i = 0; i < 100000; i++)  
{  
   list.Add(i);  
}  
              
stopWatch.Stop(); // Arrête le chronomètre  
              
// On affiche le résultat en milliseconds, pour une meilleure lisibilité  
Trace.WriteLine("Temps écoulé (ms) : " + stopWatch.Elapsed.TotalMilliseconds);

Temps écoulé (ms) : 449.0187

Note : nous pouvons aussi le déclarer différemment, avec le mot-clef var par exemple (après ça revient uniquement sur un choix de lecture et de clarté :-))

var stopWatch = Stopwatch.StartNew();

Nous pouvons aussi arrêter le chronomètre, et la reprendre par la suite, si l’on veut calculer un intervalle précis ; bien sûr, même après l’arrêt, le chronomètre garde en mémoire la valeur sur laquelle il s’est arrêté.

Par exemple, nous calculons le temps d’exécution de Method1(), puis on arrête la chronomètre pour exécuter autre chose, puis on le redémarre pour calculer le temps d’exécution de Method2() :

Stopwatch stopWatch = new Stopwatch();  
stopWatch.Start();  
Method1();  
stopWatch.Stop();  
   
List<int> list = new List<int>();  
  
for (int i = 0; i < 100000; i++)  
{  
   list.Add(i);  
}  
   
stopWatch.Start(); // On redémarre le chronomètre  
Method2();  
stopWatch.Stop();  
   
Trace.WriteLine("Temps écoulé (ms) : " + stopWatch.Elapsed.TotalMilliseconds);

Temps écoulé (ms) : 718.0647

Note : nous pouvons aussi calculer en “ticks”. Un tick (qu’on peut traduire par graduation – MSDN) représente une graduation pour X nanosecondes. Pour X, il dépends de votre matériel. Pour le calculer, il existe Stopwatch.Frequency qui nous donne la fréquence correcte.

var watch = Stopwatch.StartNew();

watch.Start();
string str = "1000";
try
{
    int value = int.Parse(str);
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}
watch.Stop();

Console.WriteLine("Frequence : " + Stopwatch.Frequency);
Console.WriteLine((1e6 * watch.ElapsedTicks / (double)Stopwatch.Frequency) 
                   + " Microsecondes");
Console.WriteLine((1000 * watch.ElapsedTicks / (double)Stopwatch.Frequency) 
                   + " Millisecondes");
Console.WriteLine(watch.ElapsedMilliseconds + " Millisecondes (Stopwatch)");

Console.Read();

Malgré le fait que les machines sont aujourd’hui de plus en plus puissantes, il est toujours utile de faire un audit des performances de son code pendant un développement, cela peut nous aider à prendre certaines décisions que l’ont n’aurait pas prises sans mesure de performance.

Plus d’informations : lien vers MSDN

Ajouter un commentaire

biuquote
  • Commentaire
  • Prévisualiser
Loading

A propos de l'auteur

Mathieu Perrein - Software Solutions Manager, Software Architect, Trainer MCT, MSP de 2010 à 2012.

 

MSP

 

MSP

MSP

 MSPD

MCT

 

Facebook

 

Ce blog est strictement personnel et les opinions exprimées ici n'engagent donc que moi, et pas mon employeur.

Tags

Vous avez désactivé JavaScript ou bien vous possédez une ancienne version d'Adobe Flash Player. Téléchargez la dernière version de Flash Player.