Programmering

Sådan benchmarkes C #-kode ved hjælp af BenchmarkDotNet

BenchmarkDotNet er et let, open source, kraftfuldt. NET-bibliotek, der kan omdanne dine metoder til benchmarks, spore disse metoder og derefter give indsigt i de indsamlede præstationsdata. Det er let at skrive BenchmarkDotNet-benchmarks, og resultaterne af benchmarking-processen er også brugervenlige.

Du kan drage fordel af BenchmarkDotNet til at benchmarkere både .NET Framework- og .NET Core-applikationer. I denne artikel undersøger vi, hvordan vi kan arbejde med BenchmarkDotNet i .NET Core. Du kan finde BenchmarkDotNet på GitHub.

For at arbejde med kodeeksemplerne i denne artikel skal du have Visual Studio 2019 installeret i dit system. Hvis du ikke allerede har en kopi, kan du downloade Visual Studio 2019 her.

Opret et konsolapplikationsprojekt i Visual Studio

Lad os først oprette et .NET Core-konsolapplikationsprojekt i Visual Studio. Forudsat at Visual Studio 2019 er installeret i dit system, skal du følge nedenstående trin for at oprette et nyt .NET Core-konsolapplikationsprojekt i Visual Studio.

  1. Start Visual Studio IDE.
  2. Klik på "Opret nyt projekt."
  3. I vinduet "Opret nyt projekt" skal du vælge "Konsolapp (.NET Core)" fra listen over skabeloner, der vises.
  4. Klik på Næste.
  5. I vinduet "Konfigurer dit nye projekt", der vises nedenfor, skal du angive navnet og placeringen for det nye projekt.
  6. Klik på Opret.

Dette opretter et nyt .NET Core-konsolapplikationsprojekt i Visual Studio 2019.

Bemærk, at når du opretter konsolapplikationsprojektet, vil den resulterende programklasse (genereres automatisk i Program.cs-filen) se sådan ud:

klasse Program

{

statisk ugyldigt Main (streng [] args)

  {

Console.WriteLine ("Hej verden!");

  }

}

Vi bruger dette projekt og programklassen til at arbejde med BenchmarkDotNet i de efterfølgende afsnit i denne artikel.

Installer BenchmarkDotNet NuGet-pakken

For at arbejde med BenchmarkDotNet skal du installere BenchmarkDotNet-pakken. Du kan gøre dette enten via NuGet Package Manager inde i Visual Studio 2019 IDE eller ved at udføre følgende kommando i NuGet Package Manager Console:

Install-Package BenchmarkDotNet

Hvorfor benchmark-kode?

Et benchmark er en måling eller et sæt målinger relateret til udførelsen af ​​et stykke kode i en applikation. Benchmarking-kode er vigtig for at forstå præstationsmålingerne for metoderne i din applikation. Det er altid en god tilgang at have metrics ved hånden, når du optimerer koden. Det er meget vigtigt for os at vide, om ændringerne i koden har forbedret eller forværret ydeevnen. Benchmarking hjælper dig også med at indsnævre de dele af koden i applikationen, der har behov for refactoring.

Trin til benchmarking af kode ved hjælp af BenchmarkDotNet

For at køre BenchmarkDotNet i din .NET Framework- eller .NET Core-applikation skal du følge disse trin:

  1. Tilføj den nødvendige NuGet-pakke
  2. Føj benchmark-attributter til dine metoder
  3. Opret en BenchmarkRunner-forekomst
  4. Kør applikationen i frigivelsestilstand

Opret en benchmarking-klasse i .NET Core

Åbn filen Program.cs, og skriv følgende kode derinde.

  [MemoryDiagnoser]

offentlig klasse MemoryBenchmarkerDemo

    {

int NumberOfItems = 100000;

[Benchmark]

offentlig streng ConcatStringsUsingStringBuilder ()

        {

var sb = ny StringBuilder ();

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

            {

sb.Append ("Hello World!" + i);

            }

returner sb.ToString ();

        }

[Benchmark]

public string ConcatStringsUsingGenericList ()

        {

var liste = ny liste (NumberOfItems);

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

            {

liste.Tilføj ("Hello World!" + i);

            }

returliste.ToString ();

        }

    }

Ovenstående program illustrerer, hvordan du kan skrive metoder til benchmarking. Bemærk brugen af ​​Benchmark-attributten oven på hver af de metoder, der skal benchmarkes.

I hovedmetoden til Program.cs-filen skal du angive det indledende startpunkt - BenchmarkRunner-klassen. Dette er en måde at informere BenchmarkDotNet om at køre benchmarks på den angivne klasse. Så udskift standardkoden for Main-metoden i Program.cs-filen ved hjælp af følgende kodestykke.

statisk ugyldigt Main (streng [] args)

{

var resume = BenchmarkRunner.Run ();

}

Kør benchmark i din .NET Core-applikation

Hvis du kører applikationen i fejlretningstilstand, er her den fejlmeddelelse, du får vist:

Ved benchmarking skal du altid sikre dig, at du kører dit projekt i frigivelsestilstand. Årsagen er, at koden optimeres forskelligt under både kompilering og frigivelsestilstand under kompilering. C # -compileren foretager et par optimeringer i frigivelsestilstand, som ikke er tilgængelige i fejlretningstilstand.

Derfor skal du kun køre dit projekt i frigivelsestilstand. For at køre benchmarking skal du angive følgende kommando ved Visual Studio-kommandoprompten.

dotnet run -p BenchmarkDotNetDemo.csproj -c frigivelse

For de bedste resultater skal du sørge for, at alle applikationer er lukket, og at alle unødvendige processer stoppes, før benchmarks køres.

Bemærk, at hvis du ikke angiver konfigurationsparameteren, vil runtime forsøge at udføre benchmarking på ikke-optimeret fejlretningskode. Og du får den samme fejl vist i figur 1.

Analyser benchmarking-resultaterne

Når udførelsen af ​​benchmarking-processen er afsluttet, vises en oversigt over resultaterne i konsolvinduet. Resuméafsnittet indeholder information relateret til det miljø, hvor benchmarks blev udført, såsom BenchmarkDotNet-version, operativsystem, computerhardware, .NET-version, compilerinformation og information relateret til applikationens ydeevne.

Et par filer oprettes også i mappen BenchmarkDotNet.Artifacts under programmets rodmappe. Her er et resumé af resultaterne.

Som det fremgår af resuméet vist i figur 2, vil du for hver benchmarked metode se en række data, der specificerer præstationsmålinger såsom gennemsnitlig udførelsestid, Gen 0, Gen 1, Gen 2 samlinger osv

Når du undersøger resultaterne vist i figur 3, kan du se, at ConcatStringUsingGenericList er meget hurtigere end ConcatStringUsingStringBuilder-metoden. Du kan også se, at der er mange flere tildelinger efter kørsel af ConcatStringUsingStringBuilder-metoden.

Tilføj nu attributten RankColumn oven på MemoryBenchmarkerDemo-klassen. Dette tilføjer en ekstra kolonne til output, der angiver, hvilken metode der var hurtigere. Kør benchmarking-processen igen ved hjælp af følgende kommando.

dotnet run -p BenchmarkDotNetDemo.csproj -c frigivelse

Når du kører denne kommando, starter benchmarking-processen og viser output, når benchmarking-processen er udført med succes. Figur 4 nedenfor viser output med RankColumn tilføjet.

BenchmarkDotNet er et godt værktøj, der giver en enkel måde at træffe en informeret beslutning om ydeevnemålingerne for din applikation. I BenchmarkDotNet kaldes påkaldelse af en metode, der har Benchmark-attributtsættet, som en operation. En iteration er navnet på en samling af flere operationer.

Du kan udforske en demo ASP.NET Core-applikation, der illustrerer flere måder at benchmarkere koden på. Du kan få applikationen fra ASP.NET repo på GitHub.

Sådan gør du mere i C #:

  • Sådan enhedstest statiske metoder i C #
  • Sådan refaktorerer du Guds objekter i C #
  • Sådan bruges ValueTask i C #
  • Sådan bruges uforanderlighed i C
  • Sådan bruges const, readonly og static i C #
  • Sådan bruges datanoteringer i C #
  • Sådan arbejder du med GUID'er i C # 8
  • Hvornår skal man bruge en abstrakt klasse vs. interface i C #
  • Sådan arbejder du med AutoMapper i C #
  • Sådan bruges lambda-udtryk i C #
  • Sådan arbejder du med Action-, Func- og Predicate-delegerede i C #
  • Sådan arbejder du med delegerede i C #
  • Sådan implementeres en simpel logger i C #
  • Sådan arbejder du med attributter i C #
  • Sådan arbejder du med log4net i C #
  • Sådan implementeres depotdesignmønsteret i C #
  • Sådan arbejder du med refleksion i C #
  • Sådan arbejder du med filsystemwatcher i C #
  • Sådan udføres doven initialisering i C #
  • Sådan arbejder du med MSMQ i C #
  • Sådan arbejder du med udvidelsesmetoder i C #
  • Hvordan vi lambda-udtryk i C #
  • Hvornår skal du bruge det flygtige nøgleord i C #
  • Sådan bruges afkastnøgleordet i C #
  • Sådan implementeres polymorfisme i C #
  • Sådan bygger du din egen opgaveplanlægning i C #
  • Sådan arbejder du med RabbitMQ i C #
  • Sådan arbejder du med en tuple i C #
  • Udforskning af virtuelle og abstrakte metoder i C #
  • Sådan bruges Dapper ORM i C #
  • Sådan bruges designmønsteret med flyvægt i C #