Programmering

Hvordan man skriver præstationstest ved hjælp af NBench

Når du arbejder med applikationer, vil du ofte have kendskab til hukommelsestildeling, skrotopsamling (GC) overhead og gennemstrømning af koden. Din ansøgning er muligvis langsom, eller det bruger muligvis mange ressourcer, og du vil finde ud af, hvad der er galt.

Selvom du kan registrere funktionelle problemer og kodefejl ved hjælp af enhedstest og kodevurderinger, har du muligvis stadig brug for en måde at isolere ydelsesproblemer på. Her er hvor NBench er praktisk. Denne artikel præsenterer en diskussion af NBench, og hvordan vi kan bruge den til at skrive præstationstest til .NET-applikationer.

Hvad er NBench? Hvorfor skal jeg bruge det?

NBench er en populær præstationsramme, der kan bruges til at profilere ydelsen af ​​metoder i vores applikation. NBench kan måle gennemstrømningen af ​​din applikations kode, hukommelsesallokeringen og GC-omkostningerne, der er involveret i at genvinde hukommelsen ved at rense uønskede objekter.

Du kan udnytte NBench til at "enhedstest" din applikations ydeevne på samme måde som du skriver enhedstest ved hjælp af XUnit- eller NUnit-rammerne. Det, jeg bedst kan lide ved NBench, er at det kan integreres i din build-pipeline. Og selvom NBench har sin egen løber, kan du stadig køre NBench ved hjælp af NUnit eller Resharper. Det føles ligesom at køre dine enhedstest.

NBench distribueres som en NuGet-pakke. Forudsat at Visual Studio allerede er installeret på dit system, kan du installere NBench via NuGet pakkehåndtering eller ved hjælp af følgende kommando i pakkehåndteringskonsollen.

Installationspakke NBench

Du skal også installere NBench.Runner-pakken, som bruges til at køre din benchmark. Du kan også gøre det via NuGet eller udføre følgende kommando fra pakkehåndteringskonsollen.

Installationspakke NBench.Runner

Hvis du er som mig, vil du gerne køre dine NBench-ydelsestest ved hjælp af NUnit. Du kan også se på at bruge Pro.NBench.xUnit også. Pro.NBench.xUnit giver dig mulighed for at opdage, køre eller fejle NBench-tests ved hjælp af xUnit i ReSharper.

Skrivning af præstationsprøver ved hjælp af NBench

Lad os undersøge, hvordan vi kan skrive og udføre præstationstest ved hjælp af NBench. Opret et nyt klassebiblioteksprojekt, og gem det med et nyttigt navn. Dernæst tilføj de NBench- og NBench.Runner-pakker, jeg nævnte ovenfor. Her er starten på vores NBench-testmetode.

[PerfBenchmark (NumberOfIterations = 1, RunMode = RunMode.Throughput,

TestMode = TestMode.Test, SkipWarmups = true)]

[ElapsedTimeAssertion (MaxTimeMilliseconds = 5000)]

offentlig ugyldighed Benchmark_Performance_ElaspedTime ()

{

// Skriv din kode, der skal benchmarkes her

}

Bemærk, at fordi vi benchmarker ydeevne, skal vi markere vores metode ved hjælp af PerfBenchmark attribut. Denne attribut fortæller løberen, hvad han skal gøre med denne metode. Vi skal også medtage en eller flere måleegenskaber. Da vi tester for eksekveringshastighed, bruger vi ElapsedTimeAssertion attribut for at specificere det tidsrum, inden hvilken metoden skal gennemføres. Der er mange andre påstandsattributter, som du kan drage fordel af. De understøttede påstande i NBench inkluderer følgende:

  • MemoryAssertionAttribute
  • GcTotalAssertionAttribute
  • ElapsedTimeAssertionAttribute
  • CounterTotalAssertionAttribute
  • GcThroughputAssertionAttribute
  • CounterThroughputAssertionAttribute
  • PerformanceCounterTotalAssertionAttribute
  • PerformanceCounterTotalAssertionAttribute

Den følgende metode illustrerer, hvordan vi kan benchmarke affaldssamlerens præstationer. Det Benchmark_Performance_GC metoden giver os maks, min, gennemsnit og standardafvigelse for samlinger, der forekommer for hver af de tre GC-generationer (generation 0, 1 og 2).

[PerfBenchmark (RunMode = RunMode.Iterations, TestMode = TestMode.Measurement)]

[GcMeasurement (GcMetric.TotalCollections, GcGeneration.AllGc)]

offentlig ugyldighed Benchmark_Performance_GC ()

{

// Skriv din kode, der skal benchmarkes her

}

Hvis du vil sammenligne ydeevne baseret på hukommelsesforbrug, er her en testmetode, du kan bruge.

[PerfBenchmark (beskrivelse,

NumberOfIterations = 5, RunMode = RunMode.Throughput, RunTimeMilliseconds = 2500, TestMode = TestMode.Test)]

[MemoryAssertion (MemoryMetric.TotalBytesAllocated, MustBe.LessThanOrEqualTo, ByteConstants.SixtyFourKb)]

offentlig ugyldighed Benchmark_Performance_Memory ()

{

// Skriv din kode, der skal benchmarkes her

}

Det MemoryAssertion attribut kan bruges til at angive, at du vil begrænse den testede metode til at forbruge ikke mere end den specificerede mængde hukommelse i hver kørsel af benchmarket. Hvis et eksempel, som vist ovenfor, bruger mere end 64 KB hukommelse, anses testen for at være mislykket.

Bemærk, at i hvert af de kodeeksempler, jeg har vist ovenfor, sprang jeg over den kode, der skal benchmarkes. Benchmarking af metoderne i din applikation er et simpelt spørgsmål om at indsætte din kode i de benchmarkmetoder, hvor jeg har angivet.

En open source, cross-platform, automatiseret præstationsprofilering til .NET-applikationer, NBench gør ydeevne og stresstest næsten lige så let som at skrive og udføre enhedstest. Du kan let integrere NBench med enhedstestningsrammer som NUnit. Du kan endda integrere NBench med xUnit og køre testene i ReSharper eller Visual Studio Test Explorer. Du kan lære mere om NBench på GitHub og på Petabridge-webstedet.