Programovanie

Ako porovnávať kód C # pomocou BenchmarkDotNet

BenchmarkDotNet je ľahká, otvorená a výkonná knižnica .NET, ktorá dokáže transformovať vaše metódy na benchmarky, sledovať ich a potom poskytnúť prehľad o zaznamenaných údajoch o výkone. Je ľahké písať referenčné hodnoty BenchmarkDotNet a výsledky procesu testovania sú rovnako užívateľsky prívetivé.

Môžete využiť výhodu BenchmarkDotNet na testovanie aplikácií .NET Framework aj .NET Core. V tomto článku si ukážeme, ako môžeme pracovať s BenchmarkDotNet v .NET Core. BenchmarkDotNet nájdete na GitHub.

Ak chcete pracovať s príkladmi kódu uvedenými v tomto článku, mali by ste mať vo svojom systéme nainštalovanú aplikáciu Visual Studio 2019. Ak ešte nemáte kópiu, môžete si tu stiahnuť Visual Studio 2019.

Vytvorte projekt konzolovej aplikácie v Visual Studio

Najprv si vytvoríme projekt konzolovej aplikácie .NET Core v Visual Studio. Za predpokladu, že je vo vašom systéme nainštalované Visual Studio 2019, vytvorte nový projekt konzolovej aplikácie .NET Core v Visual Studio podľa pokynov uvedených nižšie.

  1. Spustite Visual Studio IDE.
  2. Kliknite na „Vytvoriť nový projekt“.
  3. V okne „Vytvoriť nový projekt“ vyberte zo zobrazeného zoznamu šablón „Console App (.NET Core)“.
  4. Kliknite na Ďalej.
  5. V nasledujúcom okne „Konfigurácia nového projektu“ zadajte názov a umiestnenie nového projektu.
  6. Kliknite na tlačidlo Vytvoriť.

Týmto sa vytvorí nový projekt konzolovej aplikácie .NET Core v Visual Studio 2019.

Upozorňujeme, že pri vytváraní projektu konzolovej aplikácie bude výsledná trieda Programu (generovaná automaticky v súbore Program.cs) vyzerať takto:

triedny program

{

static void Main (reťazec [] args)

  {

Console.WriteLine („Hello World!“);

  }

}

Tento projekt a programovú triedu použijeme na prácu s BenchmarkDotNet v ďalších častiach tohto článku.

Nainštalujte si balík BenchmarkDotNet NuGet

Ak chcete pracovať s BenchmarkDotNet, musíte si nainštalovať balík BenchmarkDotNet. Môžete to urobiť buď prostredníctvom správcu balíkov NuGet vo vnútri Visual Studio 2019 IDE, alebo vykonaním nasledujúceho príkazu v konzole správcu balíkov NuGet:

Inštalačný balík BenchmarkDotNet

Prečo porovnávací kód?

Referenčná hodnota je meranie alebo súbor meraní týkajúcich sa výkonu časti kódu v aplikácii. Porovnávací kód je nevyhnutný na pochopenie metrík výkonu metód vo vašej aplikácii. Pri optimalizácii kódu je vždy dobrý prístup mať tieto metriky k dispozícii. Je pre nás veľmi dôležité vedieť, či zmeny vykonané v kóde zlepšili alebo zhoršili výkon. Benchmarking vám tiež pomôže priblížiť sa k častiam kódu v aplikácii, ktoré je potrebné refaktorovať.

Kroky na porovnanie kódu pomocou BenchmarkDotNet

Ak chcete spustiť program BenchmarkDotNet vo svojej aplikácii .NET Framework alebo .NET Core, musíte postupovať podľa týchto krokov:

  1. Pridajte potrebný balík NuGet
  2. Pridajte k svojim metódam atribúty Benchmark
  3. Vytvorte inštanciu BenchmarkRunner
  4. Spustite aplikáciu v režime Uvoľnenie

Vytvorte testovaciu triedu v .NET Core

Otvorte súbor Program.cs a napíšte doň nasledujúci kód.

  [MemoryDiagnoser]

verejná trieda MemoryBenchmarkerDemo

    {

int NumberOfItems = 100000;

[Referenčná hodnota]

verejný reťazec ConcatStringsUsingStringBuilder ()

        {

var sb = nový StringBuilder ();

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

            {

sb.Append („Hello World!“ + i);

            }

návrat sb.ToString ();

        }

[Referenčná hodnota]

verejný reťazec ConcatStringsUsingGenericList ()

        {

var list = nový Zoznam (NumberOfItems);

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

            {

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

            }

návratový zoznam.ToString ();

        }

    }

Vyššie uvedený program ilustruje, ako môžete písať metódy na testovanie. Všimnite si použitie atribútu Benchmark nad každou z metód, ktoré sa majú porovnávať.

V hlavnej metóde súboru Program.cs musíte určiť počiatočný východiskový bod - triedu BenchmarkRunner. Toto je spôsob informovania BenchmarkDotNet o vykonaní testov v určenej triede. Nahraďte teda predvolený kód hlavnej metódy v súbore Program.cs pomocou nasledujúceho útržku kódu.

static void Main (reťazec [] args)

{

var summary = BenchmarkRunner.Run ();

}

Spustite test vo svojej aplikácii .NET Core

Ak aplikáciu spustíte v režime ladenia, zobrazí sa chybové hlásenie, ktoré sa zobrazí:

Pri porovnávaní by ste sa mali vždy ubezpečiť, že ste projekt spustili v režime vydania. Dôvod je ten, že počas kompilácie je kód optimalizovaný odlišne pre režimy ladenia aj vydania. Kompilátor C # vykoná v režime vydania niekoľko optimalizácií, ktoré nie sú k dispozícii v režime ladenia.

Váš projekt by ste preto mali prevádzkovať iba v režime uvoľnenia. Ak chcete spustiť testovanie, zadajte do príkazového riadka Visual Studio nasledujúci príkaz.

dotnet run -p BenchmarkDotNetDemo.csproj -c vydanie

Pre dosiahnutie najlepších výsledkov by ste sa mali pred spustením testov uistiť, že sú všetky aplikácie zatvorené a všetky nepotrebné procesy zastavené.

Upozorňujeme, že ak nezadáte konfiguračný parameter, runtime sa pokúsi vykonať testovanie na neoptimalizovanom kóde režimu ladenia. Zobrazí sa vám rovnaká chyba ako na obrázku 1.

Analyzujte výsledky benchmarkingu

Po dokončení procesu testovania sa v okne konzoly zobrazí súhrn výsledkov. Sekcia súhrnu obsahuje informácie týkajúce sa prostredia, v ktorom sa testovacie hodnoty vykonávali, ako napríklad verzia BenchmarkDotNet, operačný systém, počítačový hardvér, verzia .NET, informácie o kompilátore a informácie týkajúce sa výkonu aplikácie.

Niekoľko súborov sa vytvorí aj v priečinku BenchmarkDotNet.Artifacts v koreňovom priečinku aplikácie. Tu je súhrn výsledkov.

Ako je zrejmé zo súhrnu zobrazeného na obrázku 2, pre každú porovnávanú metódu uvidíte riadok s údajmi, ktoré určujú metriky výkonu, ako je napríklad stredný čas vykonania, kolekcie Gen 0, Gen 1, Gen 2 atď.

Po preskúmaní výsledkov uvedených na obrázku 3 môžete vidieť, že ConcatStringUsingGenericList je oveľa rýchlejší ako metóda ConcatStringUsingStringBuilder. Môžete tiež vidieť, že po spustení metódy ConcatStringUsingStringBuilder existuje oveľa viac alokácií.

Teraz do hornej časti triedy MemoryBenchmarkerDemo pridajte atribút RankColumn. Týmto sa do výstupu pridá ďalší stĺpec označujúci, ktorá metóda bola rýchlejšia. Spustite proces testovania znova pomocou nasledujúceho príkazu.

dotnet run -p BenchmarkDotNetDemo.csproj -c vydanie

Po spustení tohto príkazu začne proces testovania a zobrazí výstup po úspešnom vykonaní procesu testovania. Obrázok 4 nižšie zobrazuje výstup s pridaným RankColumn.

BenchmarkDotNet je pekný nástroj, ktorý poskytuje jednoduchý spôsob informovaného rozhodnutia o metrikách výkonnosti vašej aplikácie. V BenchmarkDotNet je vyvolanie metódy, ktorá má nastavený atribút Benchmark, známe ako operácia. Iterácia je názov, ktorý je daný kolekcii niekoľkých operácií.

Môžete preskúmať ukážkovú aplikáciu ASP.NET Core, ktorá ilustruje niekoľko spôsobov porovnania kódu. Aplikáciu môžete získať z repo platformy ASP.NET na GitHub.

Ako urobiť viac v C #:

  • Ako testovať statické metódy v C #
  • Ako refaktorovať objekty Boha v C #
  • Ako používať ValueTask v C #
  • Ako používať nemennosť v C.
  • Ako používať const, readonly a static v C #
  • Ako používať dátové anotácie v C #
  • Ako pracovať s identifikátormi GUID v C # 8
  • Kedy použiť abstraktné rozhranie vs. rozhranie v C #
  • Ako pracovať s AutoMapperom v C #
  • Ako používať výrazy lambda v C #
  • Ako pracovať s delegátmi Action, Func a Predicate v C #
  • Ako pracovať s delegátmi v C #
  • Ako implementovať jednoduchý záznamník v C #
  • Ako pracovať s atribútmi v C #
  • Ako pracovať s log4net v C #
  • Ako implementovať vzor návrhu úložiska v C #
  • Ako pracovať s odrazom v C #
  • Ako pracovať so súborovým systémom v C #
  • Ako vykonať lenivú inicializáciu v C #
  • Ako pracovať s MSMQ v C #
  • Ako pracovať s metódami rozšírenia v C #
  • Ako na nás výrazy lambda v C #
  • Kedy použiť volatile kľúčové slovo v C #
  • Ako používať kľúčové slovo výťažku v C #
  • Ako implementovať polymorfizmus v C #
  • Ako zostaviť vlastný plánovač úloh v C #
  • Ako pracovať s RabbitMQ v C #
  • Ako pracovať s n-ticí v C #
  • Skúmanie virtuálnych a abstraktných metód v C #
  • Ako používať Dapper ORM v C #
  • Ako používať návrhový vzor mušej váhy v C #
$config[zx-auto] not found$config[zx-overlay] not found