Programiranje

Kako primerjati kodo C # z uporabo BenchmarkDotNet

BenchmarkDotNet je lahka, odprtokodna, zmogljiva knjižnica .NET, ki lahko vaše metode pretvori v primerjalne vrednosti, jim sledi in nato zagotovi vpogled v zajete podatke o zmogljivosti. BenchmarkDotNet je enostavno napisati, primerjalni rezultati pa so tudi uporabniku prijazni.

BenchmarkDotNet lahko izkoristite za primerjavo aplikacij .NET Framework in .NET Core. V tem članku bomo raziskali, kako lahko sodelujemo z BenchmarkDotNetom v .NET Core. BenchmarkDotNet najdete na GitHub.

Če želite delati s primeri kod v tem članku, morate imeti v sistemu nameščen Visual Studio 2019. Če kopije še nimate, lahko Visual Studio 2019 prenesete tukaj.

Ustvarite projekt aplikacije za konzolo v Visual Studio

Najprej ustvarimo aplikacijski projekt konzole .NET Core v Visual Studio. Ob predpostavki, da je Visual Studio 2019 nameščen v vašem sistemu, sledite spodnjim korakom, da ustvarite nov aplikacijski projekt konzole .NET Core v Visual Studio.

  1. Zaženite Visual Studio IDE.
  2. Kliknite »Ustvari nov projekt«.
  3. V oknu »Ustvari nov projekt« na seznamu predlog izberite »Console App (.NET Core)«.
  4. Kliknite Naprej.
  5. V naslednjem oknu »Konfiguriranje novega projekta« določite ime in mesto novega projekta.
  6. Kliknite Ustvari.

To bo ustvarilo nov aplikacijski projekt konzole .NET Core v Visual Studio 2019.

Upoštevajte, da bo pri ustvarjanju projekta aplikacije konzole nastali razred programa (samodejno ustvarjen v datoteki Program.cs) videti tako:

razredni program

{

statična praznina Main (string [] args)

  {

Console.WriteLine ("Pozdravljeni, svet!");

  }

}

Ta projekt in razred programa bomo uporabili za delo z BenchmarkDotNetom v naslednjih oddelkih tega članka.

Namestite paket BenchmarkDotNet NuGet

Za delo z BenchmarkDotNet morate namestiti paket BenchmarkDotNet. To lahko storite prek upravitelja paketov NuGet znotraj IDE Visual Studio 2019 ali tako, da v konzoli upravitelja paketov NuGet izvedete naslednji ukaz:

Namesti-paket BenchmarkDotNet

Zakaj primerjalna koda?

Primerjalno merilo je meritev ali niz meritev, povezanih z zmogljivostjo dela kode v aplikaciji. Primerjalna koda je bistvenega pomena za razumevanje meril uspešnosti metod v vaši aplikaciji. Ko optimizirate kodo, imate vedno dober pristop, da imate meritve na dosegu roke. Za nas je zelo pomembno, da vemo, ali so spremembe kode izboljšale ali poslabšale delovanje. Benchmarking vam pomaga tudi, da zožite dele kode v aplikaciji, ki potrebujejo refaktoring.

Koraki za primerjalno analizo kode z uporabo BenchmarkDotNet

Če želite zagnati BenchmarkDotNet v programu .NET Framework ali .NET Core, morate slediti tem korakom:

  1. Dodajte potreben paket NuGet
  2. V metode dodajte atribute primerjalnega preizkusa
  3. Ustvarite primerek BenchmarkRunner
  4. Zaženite aplikacijo v načinu sprostitve

Ustvarite razred primerjalnih preizkusov v .NET Core

Odprite datoteko Program.cs in vanjo vpišite naslednjo kodo.

  [MemoryDiagnoser]

javni razred MemoryBenchmarkerDemo

    {

int NumberOfItems = 100000;

[Primerjalno merilo]

javni niz ConcatStringsUsingStringBuilder ()

        {

var sb = novo StringBuilder ();

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

            {

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

            }

vrni sb.ToString ();

        }

[Primerjalno merilo]

javni niz ConcatStringsUsingGenericList ()

        {

var list = nov seznam (NumberOfItems);

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

            {

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

            }

vrni seznam.ToString ();

        }

    }

Zgornji program ponazarja, kako lahko napišete metode primerjalne analize. Upoštevajte uporabo atributa Benchmark na vrhu vsake metode, ki jo je treba primerjati.

V glavni metodi datoteke Program.cs morate določiti začetno izhodišče - razred BenchmarkRunner. To je način obveščanja BenchmarkDotNet, da zažene primerjalne preizkuse v določenem razredu. Torej zamenjajte privzeto kodo metode Main v datoteki Program.cs z naslednjim delčkom kode.

statična praznina Main (string [] args)

{

povzetek var = BenchmarkRunner.Run ();

}

Zaženite merilo v aplikaciji .NET Core

Če aplikacijo zaženete v načinu za odpravljanje napak, se prikaže sporočilo o napaki:

Pri primerjalni analizi morate vedno zagotoviti, da projekt zaženete v načinu izdaje. Razlog je v tem, da je med prevajanjem koda različno optimizirana tako za načine odpravljanja napak kot za sprostitev. Prevajalnik C # v načinu izdaje opravi nekaj optimizacij, ki v načinu za odpravljanje napak niso na voljo.

Zato bi morali svoj projekt zagnati samo v načinu izdaje. Če želite zagnati primerjalno preizkušanje, v ukazni poziv Visual Studio določite naslednji ukaz.

dotnet run -p BenchmarkDotNetDemo.csproj -c Release

Za najboljše rezultate se prepričajte, da so vse aplikacije zaprte in vsi nepotrebni procesi ustavljeni pred zagonom primerjalnih preizkusov.

Upoštevajte, da če ne določite konfiguracijskega parametra, bo izvajalno okolje poskusilo izvesti primerjalno preizkušanje na neoptimizirani kodi v načinu odpravljanja napak. Prikazala se vam bo enaka napaka, prikazana na sliki 1.

Analizirajte rezultate primerjalne analize

Ko je izvajanje primerjalnega preizkusa končano, se v oknu konzole prikaže povzetek rezultatov. Odsek s povzetkom vsebuje informacije, povezane z okoljem, v katerem so bile izvedene primerjalne preizkušnje, kot so različica BenchmarkDotNet, operacijski sistem, računalniška strojna oprema, različica .NET, informacije o prevajalniku in informacije, povezane z delovanjem aplikacije.

Nekaj ​​datotek bo ustvarjenih tudi v mapi BenchmarkDotNet.Artifacts v korenski mapi aplikacije. Tu je povzetek rezultatov.

Kot je razvidno iz povzetka, prikazanega na sliki 2, boste za vsako primerljivo metodo videli vrstico podatkov, ki določa meritve učinkovitosti, kot so povprečni čas izvedbe, zbirke Gen 0, Gen 1, Gen 2 itd.

Pri pregledu rezultatov, prikazanih na sliki 3, lahko vidite, da je ConcatStringUsingGenericList veliko hitrejši od metode ConcatStringUsingStringBuilder. Prav tako lahko vidite, da je po zagonu metode ConcatStringUsingStringBuilder še veliko več dodeljevanja.

Zdaj dodajte atribut RankColumn na vrh razreda MemoryBenchmarkerDemo. To bo izhodu dodalo dodaten stolpec, ki kaže, katera metoda je bila hitrejša. Znova zaženite postopek primerjalne analize z naslednjim ukazom.

dotnet run -p BenchmarkDotNetDemo.csproj -c Release

Ko zaženete ta ukaz, se postopek primerjalnega preizkušanja začne in prikaže izhod po uspešnem izvedbi primerjalnega preizkušanja. Slika 4 spodaj prikazuje rezultat z dodanim RankColumn.

BenchmarkDotNet je lepo orodje, ki ponuja preprost način za informirano odločitev o meritvah učinkovitosti vaše aplikacije. V BenchmarkDotNet je priklic metode, ki ima nastavljen atribut Benchmark, znan kot operacija. Ponovitev je ime zbirke več operacij.

Lahko raziščete predstavitveno aplikacijo ASP.NET Core, ki ponazarja več načinov primerjave kode. Aplikacijo lahko dobite v repo ASP.NET na GitHub.

Kako narediti več v jeziku C #:

  • Kako enotno preizkusiti statične metode v C #
  • Kako preoblikovati božje predmete v C #
  • Kako uporabljati ValueTask v jeziku C #
  • Kako uporabiti nespremenljivost v C
  • Kako uporabljati const, readonly in static v C #
  • Kako uporabljati pripise podatkov v jeziku C #
  • Kako delati z GUID-i v C # 8
  • Kdaj uporabiti abstraktni razred v primerjavi z vmesnikom v jeziku C #
  • Kako delati z AutoMapper v C #
  • Kako uporabljati lambda izraze v jeziku C #
  • Kako delati z delegati Action, Func in Predicate v C #
  • Kako delati z delegati v C #
  • Kako implementirati preprost zapisovalnik v jeziku C #
  • Kako delati z atributi v jeziku C #
  • Kako delati z log4net v C #
  • Kako implementirati vzorec oblikovanja repozitorija v C #
  • Kako delati z refleksijo v jeziku C #
  • Kako delati z nadzornikom datotek v C #
  • Kako izvesti leno inicializacijo v C #
  • Kako delati z MSMQ v C #
  • Kako delati z razširitvenimi metodami v jeziku C #
  • Kako do lambda izrazov v jeziku C #
  • Kdaj uporabiti hlapljivo ključno besedo v jeziku C #
  • Kako uporabiti ključno besedo yield v jeziku C #
  • Kako uporabiti polimorfizem v jeziku C #
  • Kako zgraditi lasten načrtovalnik opravil v C #
  • Kako delati z RabbitMQ v C #
  • Kako delati s korpico v jeziku C #
  • Raziskovanje virtualnih in abstraktnih metod v jeziku C #
  • Kako uporabljati Dapper ORM v C #
  • Kako uporabiti vzorec letenja v C #