Kako odrediti C # kod pomoću BenchmarkDotNet-a

BenchmarkDotNet je lagana, moćna .NET biblioteka s otvorenim izvorom koja može transformirati vaše metode u referentne vrijednosti, pratiti te metode, a zatim pružiti uvid u prikupljene podatke o izvedbi. Lako je napisati BenchmarkDotNet mjerila, a rezultati postupka usporedbe također su jednostavni za upotrebu.

Možete iskoristiti BenchmarkDotNet za usporedbu aplikacija .NET Framework i .NET Core. U ovom ćemo članku istražiti kako možemo raditi s BenchmarkDotNetom u .NET Coreu. BenchmarkDotNet možete pronaći na GitHubu.

Da biste radili s primjerima koda iz ovog članka, u sustavu biste trebali instalirati Visual Studio 2019. Ako još nemate kopiju, ovdje možete preuzeti Visual Studio 2019. 

Stvorite projekt aplikacije konzole u Visual Studiju

Prvo, kreirajmo projekt aplikacije .NET Core konzole u Visual Studiju. Pod pretpostavkom da je Visual Studio 2019 instaliran u vašem sustavu, slijedite korake opisane u nastavku da biste u Visual Studiju stvorili novi projektni program konzole .NET Core.

  1. Pokrenite Visual Studio IDE.
  2. Kliknite "Stvori novi projekt".
  3. U prozoru "Stvori novi projekt" s popisa predložaka odaberite "Aplikacija konzole (.NET Core)".
  4. Kliknite Dalje.
  5. U sljedećem prozoru "Konfiguriranje novog projekta" navedite naziv i mjesto za novi projekt.
  6. Kliknite Stvori.

To će stvoriti novi projektni program konzole .NET Core u Visual Studio 2019.

Imajte na umu da će prilikom izrade projekta aplikacije konzole rezultirajuća klasa programa (automatski generirana u datoteci Program.cs) izgledati ovako:

razredni program

{

   statička praznina Main (string [] args)

  {

      Console.WriteLine ("Pozdrav svijetu!");

  }

}

Ovaj projekt i klasu programa koristit ćemo za rad s BenchmarkDotNetom u sljedećim odjeljcima ovog članka.

Instalirajte paket BenchmarkDotNet NuGet

Da biste radili s BenchmarkDotNetom, morate instalirati paket BenchmarkDotNet. To možete učiniti putem NuGet Package Manager unutar IDE-a Visual Studio 2019 ili izvršavanjem sljedeće naredbe na konzoli NuGet Package Manager:

Instalirajte-paket BenchmarkDotNet

Zašto referentni kod?

Mjerilo je mjerenje ili skup mjerenja koji se odnose na izvedbu dijela koda u aplikaciji. Benchmarking kôd je presudan za razumijevanje metrike izvedbe metoda u vašoj aplikaciji. Uvijek je dobar pristup imati metriku pri ruci kada optimizirate kôd. Za nas je vrlo važno znati jesu li promjene u kodu poboljšale ili pogoršale performanse. Benchmarking vam također pomaže suziti dijelove koda u aplikaciji koji trebaju refaktoriranje.

Koraci za usporedbu koda pomoću BenchmarkDotNet-a

Da biste pokrenuli BenchmarkDotNet u svojoj .NET Framework ili .NET Core aplikaciji, morate slijediti ove korake:

  1. Dodajte potreban NuGet paket
  2. Svojim metodama dodajte atribute mjerila
  3. Stvorite instancu BenchmarkRunner
  4. Pokrenite aplikaciju u načinu izdavanja

Stvorite razred referentne vrijednosti u .NET Coreu

Otvorite datoteku Program.cs i tamo napišite sljedeći kod.

  [MemoryDiagnoser]

   javna klasa MemoryBenchmarkerDemo

    {

        int NumberOfItems = 100000;

        [Mjerilo]

        javni niz ConcatStringsUsingStringBuilder ()

        {

            var sb = novi StringBuilder ();

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

            {

                sb.Append ("Pozdrav svijetu!" + i);

            }

            vrati sb.ToString ();

        }

        [Mjerilo]

        javni niz ConcatStringsUsingGenericList ()

        {

            var list = novi popis (NumberOfItems);

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

            {

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

            }

            vratiti popis.ToString ();

        }

    }

Gornji program ilustrira kako možete napisati metode za usporedbu. Obratite pažnju na upotrebu atributa Benchmark na vrhu svake od metoda koje se trebaju usporediti.

U metodi Main datoteke Program.cs morate navesti početnu početnu točku - klasu BenchmarkRunner. Ovo je način informiranja BenchmarkDotNet-a o izvođenju mjerila na navedenoj klasi. Dakle, zamijenite zadani kôd glavne metode u datoteci Program.cs pomoću sljedećeg isječka koda.

statička praznina Main (string [] args)

{

   var sažetak = BenchmarkRunner.Run ();

}

Pokrenite mjerilo u svojoj .NET Core aplikaciji

Ako aplikaciju pokrenete u načinu uklanjanja pogrešaka, evo poruke o pogrešci koju ćete vidjeti:

Prilikom uspoređivanja uvijek biste trebali osigurati da svoj projekt pokrećete u načinu izdavanja. Razlog je taj što se tijekom kompajliranja kod različito optimizira i za načine uklanjanja pogrešaka i za otpuštanje. Kompajler C # vrši nekoliko optimizacija u načinu izdavanja koje nisu dostupne u načinu otklanjanja pogrešaka.

Stoga biste svoj projekt trebali pokretati samo u izdanju. Da biste pokrenuli usporednu analizu, navedite sljedeću naredbu u naredbenom retku Visual Studija.

dotnet run -p BenchmarkDotNetDemo.csproj -c Izdanje

Za najbolje rezultate trebali biste osigurati da su sve aplikacije zatvorene i svi nepotrebni procesi zaustavljeni prije pokretanja mjerila.

Imajte na umu da ako ne navedete parametar konfiguracije, tada će vrijeme izvođenja pokušati izvršiti usporedbu na ne-optimiziranom kodu načina uklanjanja pogrešaka. I prikazat će vam se ista pogreška prikazana na slici 1.

Analizirajte rezultate usporedne analize

Nakon završetka postupka usporedne analize, sažetak rezultata prikazat će se na prozoru konzole. Odjeljak sažetka sadrži informacije povezane s okolinom u kojoj su izvršene referentne vrijednosti, poput verzije BenchmarkDotNet, operativnog sustava, računalnog hardvera, verzije .NET, podataka o kompajleru i podataka koji se odnose na izvedbu aplikacije.

Nekoliko datoteka također će se stvoriti u mapi BenchmarkDotNet.Artifacts ispod korijenske mape aplikacije. Evo sažetka rezultata. 

Kao što je vidljivo iz sažetka prikazanog na slici 2, za svaku referentnu metodu vidjet ćete red podataka koji određuje mjerne podatke izvedbe kao što su srednje vrijeme izvršavanja, zbirke Gen 0, Gen 1, Gen 2 itd.

Istražujući rezultate prikazane na slici 3, možete vidjeti da je ConcatStringUsingGenericList mnogo brži od ConcatStringUsingStringBuilder metode. Također možete vidjeti da postoji mnogo više dodjela nakon pokretanja metode ConcatStringUsingStringBuilder.

Sada dodajte atribut RankColumn na vrh klase MemoryBenchmarkerDemo. To će dodati dodatni stupac na izlaz koji pokazuje koja je metoda bila brža. Ponovno pokrenite postupak usporedbe pomoću sljedeće naredbe.

dotnet run -p BenchmarkDotNetDemo.csproj -c Izdanje

Kad pokrenete ovu naredbu, započinje postupak usporedbe i prikazuje izlaz nakon uspješnog izvođenja postupka usporedne analize. Slika 4 dolje prikazuje izlaz s dodanim RankColumn. 

BenchmarkDotNet je lijep alat koji pruža jednostavan način donošenja utemeljene odluke o mjernim podacima izvedbe vaše aplikacije. U BenchmarkDotNetu pozivanje metode koja ima postavljeni atribut Benchmark poznato je kao operacija. Ponavljanje je naziv koji se daje zbirci nekoliko operacija. 

Možete istražiti demo aplikaciju ASP.NET Core koja ilustrira nekoliko načina za uspoređivanje koda. Aplikaciju možete dobiti iz ASP.NET repo-a na GitHub-u. 

Kako učiniti više u C #: 

  • Kako jedinica testirati statičke metode u C #
  • Kako refaktorirati Božje objekte u C #
  • Kako koristiti ValueTask u C #
  • Kako se koristi nepromjenjivost u C
  • Kako koristiti const, readonly i static u C #
  • Kako koristiti bilješke podataka u C #
  • Kako raditi s GUID-ovima u C # 8
  • Kada koristiti apstraktnu klasu naspram sučelja u C #
  • Kako raditi s AutoMapperom u C #
  • Kako koristiti lambda izraze u C #
  • Kako raditi s delegatima Action, Func i Predicate u C #
  • Kako raditi s delegatima u C #
  • Kako implementirati jednostavni zapisnik u C #
  • Kako raditi s atributima u C #
  • Kako raditi s log4netom na C #
  • Kako implementirati obrazac dizajna spremišta u C #
  • Kako raditi s refleksijom u C #
  • Kako raditi s nadzornikom datoteka u C #
  • Kako izvesti lijenu inicijalizaciju u C #
  • Kako raditi s MSMQ-om u C #
  • Kako raditi s metodama produženja u C #
  • Kako do nas lambda izrazi u C #
  • Kada upotrijebiti hlapljivu ključnu riječ u C #
  • Kako koristiti ključnu riječ yield u C #
  • Kako implementirati polimorfizam u C #
  • Kako izraditi vlastiti planer zadataka u C #
  • Kako raditi s RabbitMQ u C #
  • Kako raditi s korpicom u C #
  • Istraživanje virtualnih i apstraktnih metoda u C #
  • Kako koristiti Dapper ORM u C #
  • Kako koristiti uzorak dizajna muhe u C #