Toutoune DevZone

.NET (C#)

février 2008 - Messages

Benchmark de code C#

Voici un petit utilitaire que j'ai codé y a un petit moment et qui permet facilement de tester les perfs de bouts de code C#.
N'hésitez pas à y apporter des améliorations et à me faire un petit retour ;)
Vous avez à votre dispo le code complet dans le ZIP en fichier joint.

C'est cette petite appli console qui m'avait permis d'écrire le billet Cast versus As ou que Seb utilise dans son billet Utiliser string.ToLower() c'est mal ! pour tester les perf de ses deux méthodes.

Le principe est simple, vous lui passez en entrée N méthodes C# à tester et en sortie vous récupérez un rapport du style :
 (Seb, je me permet d'utiliser ta capture :))
Sur cet exemple, 2 méthodes ont été chronométrées 5 fois. Chaque colonne représente une méthode.
La moyenne des temps est calculée et un pourcentage exprime la diférence entre la méthode courante et la méthode la plus rapide.

Au niveau code, tout est basé sur une méthode "Test" dont voici la signature :

public delegate void MethodToTest();

/// <summary>
/// Writes on the standard output a performance report of several given methods.
/// <remarks>To be relevant, each report time must be greater than 20ms.</remarks>
/// </summary>
/// <param name="iterCount">Iteration count, a method is executed several time while being timed.
/// Change this argument to increase or decrease this time.</param>
/// <param name="testCount">Report row count.
/// More test are done, more relevant is the final average time.</param>
/// <param name="methods">Methods to test.</param>
public
static void Test(int iterCount, int testCount, params MethodToTest[] methods)
{ ... }
 

  • "iterCount" représente le nombre d'itérations à réaliser durant le test d'une méthode. Dans l'archive ZIP jointe à ce billet, vous verrez que je teste la différence entre un for et un foreach. Etant donné la rapidité de ces instructions et pour pouvoir mesurer un temps pertinent, chaque méthode est exécutée 3000 fois.
  • "testCount" est le nombre de tests qui seront lancés, c'est-à-dire le nombre de lignes que comportera le rapport affiché. Dans la capture d'écran de Seb ci-dessus, testCount a pour valeur 5.
  • "methods" est un tableau de délégués à lancer.

Voici un exemple d'utilisation :

class Program
{
   static int[] coll = new int[100000];

   static void Main(string[] args)
   {
      Test(
         3000,
         10,
         delegate
         {
            for (int l = 0; l < 100000; l++);
         },
         delegate
         {
            foreach (int l in coll);
         });
   }
}

Quelques remarques pour finir :

  • N'oubliez pas que votre config de build influe sur les perfs mesurées. Il arrive qu'une méthode soit plus rapide qu'une autre en Debug et que cela ne soit plus vrai en Release après optimisation du code par le compilateur.
  • Vous noterez dans mon exemple que la collection "coll" utilisée par le foreach est statique. Pourquoi ? Pour que l'instantiation de la collection ne rentre pas en compte dans le calcul de perfs du second délégué.

En espérant que cela vous soit utile :)

Posted: févr. 13 2008, 11:42 par Toutoune_31 | avec 3 comment(s)
Classé sous :