Dzisiaj chciałbym pokazać BenchmarkDotNet. Dzięki niemu w łatwy sposób można przetestować wydajność konkretnych metod w c#. Na blogu temat wydajności poruszałem już wiele razy i wiemy, nie jest łatwe prawidłowe zmierzenie czasu wykonania kodu. Pamiętajmy, że kod wykonany pierwszy raz zawsze musi zostać przetłumaczony do kodu maszynowego (JIT). W momencie wywołania pierwszy raz jakiejkolwiek metody, CLR sprawdzi czy dana metoda ma już kod maszynowy. Jeśli jakaś metoda w ogóle nie została wykonana, wtedy nie ma nawet potrzeby generowania kodu maszynowego. W celu rzetelnego przetestowania jakiejkolwiek metody, należy zawsze wykonać “warm-up”.
Dzięki BenchmarkDotNet nie musimy się o to martwić. Automatycznie zostaną stworzone odizolowane projekty dla każdego z testów. Framework zadba o wyliczenie statystyk takich jak m.in. mediana czy odchylenie standardowe.
Zacznijmy od instalacji pakietu NuGet:
PM> Install-Package BenchmarkDotNet
Kod, który będziemy testować wygląda następująco:
public class SomeCode { public void CalculateSlow() { Thread.Sleep(5000); } public void CalculateFast() { Thread.Sleep(5); } }
Sam test z kolei, to nic innego jak klasa oznaczona atrybutami [Benchmark]:
public class PerformanceTests { private readonly SomeCode _sut=new SomeCode(); [Benchmark] public void CalculateSlowTest() { _sut.CalculateSlow(); } [Benchmark] public void CalculateFastTest() { _sut.CalculateFast(); } }
W celu wykonania testu, należy skorzystać z klasy BenchmarkRunner:
Summary summary = BenchmarkRunner.Run<PerformanceTests>();
Jak widzimy, w wyniku dostaniemy obiekt Summary, zawierający szczegóły z testów. Nie musimy się jednak nim przejmować teraz, ponieważ framework wygeneruje automatycznie raporty zarówno w formie plików tekstowych, jak i na wyjściu aplikacji konsolowej. Po odpaleniu powyższego kodu, na początku zobaczymy:
Przez następne kilka sekund\minut będą wykonywane powyższe testy. Po zakończeniu, na ekranie konsoli zobaczymy podsumowanie:
Oprócz tego, w folderze bin zobaczymy kilka raportów m.in. PerformanceTests-measurements.csv, PerformanceTests-report.csv, PerformanceTests-report.html jak i również w formie markdown. Jeśli nie wystarczają one, można napisać własne i odpowiednio skonfigurować BenchmarkDotNet.
Próbuję, próbuję i coś nie chce zadziałać. Czy możliwe, że nie ma jeszcze wersji BenchmarkDotNet, która by wspierała MSBuild 14.0.0.0 ? A może nie wspiera Windows Forms ?
Swoją drogą, jakiego edytora tekstowego w konsoli używasz, że potrafi dzielić tekst kolorami ?