Comment comparer le code C # à l'aide de BenchmarkDotNet

BenchmarkDotNet est une bibliothèque .NET légère, open source et puissante qui peut transformer vos méthodes en références, suivre ces méthodes, puis fournir des informations sur les données de performance capturées. Il est facile d'écrire des benchmarks BenchmarkDotNet et les résultats du processus de benchmarking sont également conviviaux.

Vous pouvez tirer parti de BenchmarkDotNet pour évaluer les applications .NET Framework et .NET Core. Dans cet article, nous allons explorer comment nous pouvons travailler avec BenchmarkDotNet dans .NET Core. Vous pouvez trouver BenchmarkDotNet sur GitHub.

Pour utiliser les exemples de code fournis dans cet article, vous devez disposer de Visual Studio 2019 installé sur votre système. Si vous n'en avez pas déjà une copie, vous pouvez télécharger Visual Studio 2019 ici. 

Créer un projet d'application console dans Visual Studio

Tout d'abord, créons un projet d'application console .NET Core dans Visual Studio. En supposant que Visual Studio 2019 est installé sur votre système, suivez les étapes décrites ci-dessous pour créer un nouveau projet d'application console .NET Core dans Visual Studio.

  1. Lancez l'IDE de Visual Studio.
  2. Cliquez sur "Créer un nouveau projet".
  3. Dans la fenêtre «Créer un nouveau projet», sélectionnez «Application console (.NET Core)» dans la liste des modèles affichés.
  4. Cliquez sur Suivant.
  5. Dans la fenêtre «Configurer votre nouveau projet» ci-dessous, spécifiez le nom et l'emplacement du nouveau projet.
  6. Cliquez sur Créer.

Cela créera un nouveau projet d'application console .NET Core dans Visual Studio 2019.

Notez que lorsque vous créez le projet d'application console, la classe Program résultante (générée automatiquement dans le fichier Program.cs) ressemblera à ceci:

programme de classe

{

   static void Main (string [] args)

  {

      Console.WriteLine ("Hello World!");

  }

}

Nous utiliserons ce projet et cette classe de programme pour travailler avec BenchmarkDotNet dans les sections suivantes de cet article.

Installez le package NuGet BenchmarkDotNet

Pour travailler avec BenchmarkDotNet, vous devez installer le package BenchmarkDotNet. Vous pouvez le faire via le gestionnaire de packages NuGet dans l'IDE de Visual Studio 2019 ou en exécutant la commande suivante dans la console du gestionnaire de packages NuGet:

Benchmark du package d'installation

Pourquoi un code de référence?

Un benchmark est une mesure ou un ensemble de mesures liées aux performances d'un morceau de code dans une application. L'analyse comparative du code est essentielle pour comprendre les métriques de performance des méthodes de votre application. C'est toujours une bonne approche d'avoir les métriques à portée de main lorsque vous optimisez du code. Il est très important pour nous de savoir si les modifications apportées au code ont amélioré ou dégradé les performances. L'analyse comparative vous aide également à cibler les parties du code de l'application qui doivent être refactorisées.

Étapes de l'analyse comparative du code à l'aide de BenchmarkDotNet

Pour exécuter BenchmarkDotNet dans votre application .NET Framework ou .NET Core, vous devez suivre ces étapes:

  1. Ajouter le package NuGet nécessaire
  2. Ajoutez des attributs de référence à vos méthodes
  3. Créer une instance BenchmarkRunner
  4. Exécutez l'application en mode Release

Créer une classe d'analyse comparative dans .NET Core

Ouvrez le fichier Program.cs et écrivez le code suivant.

  [MemoryDiagnoser]

   public class MemoryBenchmarkerDemo

    {

        int NumberOfItems = 100000;

        [Référence]

        chaîne publique ConcatStringsUsingStringBuilder ()

        {

            var sb = new StringBuilder ();

            pour (int i = 0; i <NumberOfItems; i ++)

            {

                sb.Append ("Bonjour le monde!" + i);

            }

            return sb.ToString ();

        }

        [Référence]

        chaîne publique ConcatStringsUsingGenericList ()

        {

            var list = new List (NumberOfItems);

            pour (int i = 0; i <NumberOfItems; i ++)

            {

                list.Add ("Hello World!" + i);

            }

            return list.ToString ();

        }

    }

Le programme ci-dessus illustre comment vous pouvez écrire des méthodes d'analyse comparative. Notez l'utilisation de l'attribut Benchmark en plus de chacune des méthodes qui doivent être évaluées.

Dans la méthode Main du fichier Program.cs, vous devez spécifier le point de départ initial - la classe BenchmarkRunner. C'est une manière d'informer BenchmarkDotNet d'exécuter des benchmarks sur la classe spécifiée. Remplacez donc le code par défaut de la méthode Main dans le fichier Program.cs à l'aide de l'extrait de code suivant.

static void Main (string [] args)

{

   var summary = BenchmarkRunner.Run ();

}

Exécutez le benchmark dans votre application .NET Core

Si vous exécutez l'application en mode débogage, voici le message d'erreur que vous verrez:

Lors de l'analyse comparative, vous devez toujours vous assurer que vous exécutez votre projet en mode version. La raison en est que lors de la compilation, le code est optimisé différemment pour les modes de débogage et de publication. Le compilateur C # effectue quelques optimisations en mode version qui ne sont pas disponibles en mode débogage.

Par conséquent, vous ne devez exécuter votre projet qu'en mode version. Pour exécuter l'analyse comparative, spécifiez la commande suivante à l'invite de commandes Visual Studio.

dotnet run -p BenchmarkDotNetDemo.csproj -c Release

Pour de meilleurs résultats, vous devez vous assurer que toutes les applications sont fermées et que tous les processus inutiles sont arrêtés avant d'exécuter les tests de performances.

Notez que si vous ne spécifiez pas le paramètre de configuration, le moteur d'exécution tentera d'effectuer une analyse comparative sur du code en mode débogage non optimisé. Et vous serez présenté avec la même erreur que celle illustrée dans la figure 1.

Analyser les résultats du benchmarking

Une fois l'exécution du processus d'analyse comparative terminée, un résumé des résultats sera affiché dans la fenêtre de la console. La section récapitulative contient des informations relatives à l'environnement dans lequel les tests de performance ont été exécutés, telles que la version de BenchmarkDotNet, le système d'exploitation, le matériel informatique, la version .NET, les informations du compilateur et les informations relatives aux performances de l'application.

Quelques fichiers seront également créés dans le dossier BenchmarkDotNet.Artifacts sous le dossier racine de l'application. Voici un résumé des résultats. 

Comme le montre le résumé présenté à la figure 2, pour chaque méthode de référence, vous verrez une ligne de données qui spécifie les mesures de performance telles que le temps d'exécution moyen, les collections Gen 0, Gen 1, Gen 2, etc.

En examinant les résultats présentés dans la figure 3, vous pouvez voir que le ConcatStringUsingGenericList est beaucoup plus rapide que la méthode ConcatStringUsingStringBuilder. Vous pouvez également voir qu'il y a beaucoup plus d'allocations après l'exécution de la méthode ConcatStringUsingStringBuilder.

Ajoutez maintenant l'attribut RankColumn au-dessus de la classe MemoryBenchmarkerDemo. Cela ajoutera une colonne supplémentaire à la sortie indiquant quelle méthode était la plus rapide. Exécutez à nouveau le processus d'analyse comparative à l'aide de la commande suivante.

dotnet run -p BenchmarkDotNetDemo.csproj -c Release

Lorsque vous exécutez cette commande, le processus d'analyse comparative démarre et affiche la sortie une fois que le processus d'analyse comparative a été exécuté avec succès. La figure 4 ci-dessous montre la sortie avec RankColumn ajouté. 

BenchmarkDotNet est un bel outil qui fournit un moyen simple de prendre une décision éclairée sur les métriques de performance de votre application. Dans BenchmarkDotNet, l'appel d'une méthode dont l'attribut Benchmark est défini est appelé opération. Une itération est le nom donné à une collection de plusieurs opérations. 

Vous pouvez explorer une application ASP.NET Core de démonstration qui illustre plusieurs façons de comparer le code. Vous pouvez obtenir l'application à partir du référentiel ASP.NET sur GitHub. 

Comment faire plus en C #: 

  • Comment tester des méthodes statiques en C #
  • Comment refactoriser des objets Dieu en C #
  • Comment utiliser ValueTask en C #
  • Comment utiliser l'immuabilité en C
  • Comment utiliser const, readonly et static en C #
  • Comment utiliser les annotations de données en C #
  • Comment travailler avec les GUID en C # 8
  • Quand utiliser une classe abstraite ou une interface en C #
  • Comment travailler avec AutoMapper en C #
  • Comment utiliser les expressions lambda en C #
  • Comment travailler avec les délégués Action, Func et Predicate en C #
  • Comment travailler avec des délégués en C #
  • Comment implémenter un simple logger en C #
  • Comment travailler avec des attributs en C #
  • Comment travailler avec log4net en C #
  • Comment implémenter le modèle de conception de référentiel en C #
  • Comment travailler avec la réflexion en C #
  • Comment travailler avec Filesystemwatcher en C #
  • Comment effectuer une initialisation différée en C #
  • Comment travailler avec MSMQ en C #
  • Comment travailler avec des méthodes d'extension en C #
  • Comment utiliser les expressions lambda en C #
  • Quand utiliser le mot clé volatile en C #
  • Comment utiliser le mot clé yield en C #
  • Comment implémenter le polymorphisme en C #
  • Comment créer votre propre planificateur de tâches en C #
  • Comment travailler avec RabbitMQ en C #
  • Comment travailler avec un tuple en C #
  • Explorer les méthodes virtuelles et abstraites en C #
  • Comment utiliser l'ORM Dapper en C #
  • Comment utiliser le modèle de conception de poids mouche en C #