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