BenchmarkDotNet – prosta biblioteka do testów wydajnościowych

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:
1

Przez następne kilka sekund\minut będą wykonywane powyższe testy. Po zakończeniu, na ekranie konsoli zobaczymy podsumowanie:
2

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.

2 thoughts on “BenchmarkDotNet – prosta biblioteka do testów wydajnościowych”

  1. 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 ?

  2. Swoją drogą, jakiego edytora tekstowego w konsoli używasz, że potrafi dzielić tekst kolorami ?

Leave a Reply

Your email address will not be published.