Programování

Jak srovnávat C # kód pomocí BenchmarkDotNet

BenchmarkDotNet je odlehčená, otevřená a výkonná knihovna .NET, která dokáže transformovat vaše metody na měřítka, sledovat tyto metody a poté poskytnout přehled o zachycených datech o výkonu. Je snadné psát benchmarky BenchmarkDotNet a výsledky procesu benchmarkingu jsou také uživatelsky přívětivé.

Můžete využít výhod BenchmarkDotNet pro srovnání aplikací .NET Framework a .NET Core. V tomto článku prozkoumáme, jak můžeme pracovat s BenchmarkDotNet v .NET Core. BenchmarkDotNet najdete na GitHubu.

Chcete-li pracovat s příklady kódu uvedenými v tomto článku, měli byste mít ve svém systému nainstalovanou Visual Studio 2019. Pokud ještě nemáte kopii, můžete si stáhnout Visual Studio 2019 zde.

Vytvořte projekt konzolové aplikace v sadě Visual Studio

Nejprve si vytvořme projekt konzolové aplikace .NET Core v sadě Visual Studio. Za předpokladu, že je ve vašem systému nainstalovaná sada Visual Studio 2019, postupujte podle níže uvedených kroků a vytvořte nový projekt konzolové aplikace .NET Core v sadě Visual Studio.

  1. Spusťte Visual Studio IDE.
  2. Klikněte na „Vytvořit nový projekt“.
  3. V okně „Vytvořit nový projekt“ vyberte ze zobrazeného seznamu šablon „Console App (.NET Core)“.
  4. Klikněte na Další.
  5. V dalším okně „Konfigurace nového projektu“ zadejte název a umístění nového projektu.
  6. Klikněte na Vytvořit.

Tím se vytvoří nový projekt aplikace konzoly .NET Core v sadě Visual Studio 2019.

Všimněte si, že při vytváření projektu konzolové aplikace bude výsledná Třída Programu (generovaná automaticky v souboru Program.cs) vypadat takto:

třídní program

{

static void Main (řetězec [] args)

  {

Console.WriteLine („Hello World!“);

  }

}

Tento projekt a třídu programu použijeme pro práci s BenchmarkDotNet v následujících částech tohoto článku.

Nainstalujte balíček NuGet BenchmarkDotNet

Abyste mohli pracovat s BenchmarkDotNet, musíte si nainstalovat balíček BenchmarkDotNet. Můžete to udělat buď pomocí Správce balíčků NuGet uvnitř IDE sady Visual Studio 2019, nebo provedením následujícího příkazu v konzole Správce balíčků NuGet:

Instalační balíček BenchmarkDotNet

Proč srovnávací kód?

Benchmark je měření nebo sada měření souvisejících s výkonem části kódu v aplikaci. Benchmarkingový kód je nezbytný pro pochopení metrik výkonu metod ve vaší aplikaci. Při optimalizaci kódu je vždy dobrý přístup mít metriky k dispozici. Je pro nás velmi důležité vědět, zda změny provedené v kódu zlepšily nebo zhoršily výkon. Benchmarking vám také pomůže zúžit části kódu v aplikaci, které vyžadují refaktoring.

Kroky pro srovnání kódu pomocí BenchmarkDotNet

Chcete-li spustit BenchmarkDotNet v aplikaci .NET Framework nebo .NET Core, musíte postupovat podle těchto kroků:

  1. Přidejte potřebný balíček NuGet
  2. Přidejte do svých metod atributy Benchmark
  3. Vytvořte instanci BenchmarkRunner
  4. Spusťte aplikaci v režimu Release

Vytvořte srovnávací třídu v .NET Core

Otevřete soubor Program.cs a napište tam následující kód.

  [MemoryDiagnoser]

veřejná třída MemoryBenchmarkerDemo

    {

int NumberOfItems = 100000;

[Benchmark]

veřejný řetězec ConcatStringsUsingStringBuilder ()

        {

var sb = nový StringBuilder ();

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

            {

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

            }

vrátit sb.ToString ();

        }

[Benchmark]

veřejný řetězec ConcatStringsUsingGenericList ()

        {

var list = nový seznam (NumberOfItems);

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

            {

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

            }

návratový seznam.ToString ();

        }

    }

Výše uvedený program ilustruje, jak můžete psát metody pro srovnávání. Všimněte si použití atributu Benchmark nad každou z metod, které mají být testovány.

V hlavní metodě souboru Program.cs musíte zadat počáteční výchozí bod - třídu BenchmarkRunner. Toto je způsob, jak informovat BenchmarkDotNet o spouštění testů ve specifikované třídě. Takže nahraďte výchozí kód metody Main v souboru Program.cs pomocí následujícího fragmentu kódu.

static void Main (řetězec [] args)

{

var shrnutí = BenchmarkRunner.Run ();

}

Spusťte měřítko v aplikaci .NET Core

Pokud spustíte aplikaci v režimu ladění, zobrazí se chybová zpráva, která se zobrazí:

Při srovnávání byste měli vždy zajistit, aby byl váš projekt spuštěn v režimu vydání. Důvodem je, že během kompilace je kód optimalizován odlišně pro režimy ladění i vydání. Kompilátor C # provede několik optimalizací v režimu vydání, které nejsou k dispozici v režimu ladění.

Proto byste měli svůj projekt spouštět pouze v režimu vydání. Chcete-li spustit srovnávání, zadejte na příkazovém řádku sady Visual Studio následující příkaz.

dotnet run -p BenchmarkDotNetDemo.csproj -c Release

Pro dosažení nejlepších výsledků byste se měli ujistit, že jsou všechny aplikace zavřené a všechny nepotřebné procesy zastaveny před spuštěním testů.

Všimněte si, že pokud nezadáte konfigurační parametr, pak se modul runtime pokusí provést srovnávání na neoptimalizovaném kódu v režimu ladění. Zobrazí se stejná chyba jako na obrázku 1.

Analyzujte výsledky benchmarkingu

Po dokončení procesu benchmarkingu se v okně konzoly zobrazí souhrn výsledků. Souhrnná část obsahuje informace související s prostředím, ve kterém byly benchmarky provedeny, jako je například verze BenchmarkDotNet, operační systém, počítačový hardware, verze .NET, informace o kompilátoru a informace související s výkonem aplikace.

Několik souborů bude také vytvořeno ve složce BenchmarkDotNet.Artifacts v kořenové složce aplikace. Zde je souhrn výsledků.

Jak je patrné ze souhrnu zobrazeného na obrázku 2, pro každou srovnávanou metodu uvidíte řadu dat, která specifikuje metriky výkonu, jako je průměrná doba provedení, kolekce Gen 0, Gen 1, Gen 2 atd.

Při zkoumání výsledků uvedených na obrázku 3 můžete vidět, že ConcatStringUsingGenericList je mnohem rychlejší než metoda ConcatStringUsingStringBuilder. Můžete také vidět, že po spuštění metody ConcatStringUsingStringBuilder existuje mnohem více alokací.

Nyní přidejte atribut RankColumn nad třídu MemoryBenchmarkerDemo. Tím se do výstupu přidá další sloupec označující, která metoda byla rychlejší. Spusťte proces srovnávání znovu pomocí následujícího příkazu.

dotnet run -p BenchmarkDotNetDemo.csproj -c Release

Když spustíte tento příkaz, proces benchmarkingu nastartuje a zobrazí výstup po úspěšném provedení procesu benchmarkingu. Obrázek 4 níže ukazuje výstup s přidaným RankColumn.

BenchmarkDotNet je pěkný nástroj, který poskytuje jednoduchý způsob, jak učinit informované rozhodnutí o metrikách výkonu vaší aplikace. V BenchmarkDotNet je vyvolání metody, která má sadu atributů Benchmark, známé jako operace. Iterace je název daný kolekci několika operací.

Můžete prozkoumat ukázkovou aplikaci ASP.NET Core, která ilustruje několik způsobů, jak srovnávat kód. Aplikaci můžete získat z úložiště ASP.NET na GitHubu.

Jak udělat více v C #:

  • Jak testovat statické metody v C #
  • Jak refaktorovat Boží objekty v C #
  • Jak používat ValueTask v C #
  • Jak používat neměnnost v C.
  • Jak používat const, readonly a static v C #
  • Jak používat datové anotace v C #
  • Jak pracovat s identifikátory GUID v C # 8
  • Kdy použít abstraktní třídu vs. rozhraní v C #
  • Jak pracovat s AutoMapperem v C #
  • Jak používat výrazy lambda v C #
  • Jak pracovat s delegáty Action, Func a Predicate v C #
  • Jak pracovat s delegáty v C #
  • Jak implementovat jednoduchý záznamník v C #
  • Jak pracovat s atributy v C #
  • Jak pracovat s log4net v C #
  • Jak implementovat vzor návrhu úložiště v C #
  • Jak pracovat s odrazem v C #
  • Jak pracovat se souborovým systémem v C #
  • Jak provést línou inicializaci v C #
  • Jak pracovat s MSMQ v C #
  • Jak pracovat s metodami rozšíření v C #
  • Jak na nás lambda výrazy v C #
  • Kdy použít volatilní klíčové slovo v C #
  • Jak používat klíčové slovo výnos v C #
  • Jak implementovat polymorfismus v C #
  • Jak vytvořit svůj vlastní plánovač úloh v C #
  • Jak pracovat s RabbitMQ v C #
  • Jak pracovat s n-ticí v C #
  • Zkoumání virtuálních a abstraktních metod v C #
  • Jak používat Dapper ORM v C #
  • Jak používat návrhový vzor muší váhy v C #
$config[zx-auto] not found$config[zx-overlay] not found