Mierzenie wydajności kodu za pomocą BenchmarkDotNet

Wiele razy gdy piszemy nową funkcjonalność zastanawiamy się nad wydajnością naszego kodu. Zastanawiamy się, który sposób będzie bardziej wydajny. Często piszemy wtedy własny test różnych wersji przy pomocy klasy StopWatch. Jednak możemy znacznie przyspieszyć ten proces i przy okazji dostać wiele różnych możliwości konfiguracji, np sprawdzenia jak kod szybko zadziała w CLR, Core czy Mono. To wszystko zapewnia nam bohater dzisiejszego wpisu- biblioteka BenchmarkDotNet.

Pierwsze testy

Za przykład wziąłem sklejanie stringów za pomocą operatora „+” string oraz klasy StringBuilder.

Pierwsze co musimy zrobić, to zainstalować paczkę nugetową BenchmarkDotNet. Następnie metody, które chcemy przetestować z danej klasy, oznaczamy atrybutem [Benchmark]. Co ważne, metody te muszą być bezparametrowe. Dalej benchmark odpalamy jedną linią kodu, wywołując BenchmarkRunner.Run<{Nazwa_Testowanej_Klasy}>(), koniecznie w konfiguracji Release. I to wszystko 🙂

 

Wyniku testu pojawiają się w folderze bin/Release/BenchmarkDotNet.Artifacts/results. Znajduje się tam kilka plików, jednak nas będzie najbardziej interesował plik .html, który jest skróconą wersją podsumowania.

BenchmarkDotNetSummary1
Podsumowanie testów

Konfiguracja

Aby poznać dogłębnie bibliotekę, przejrzymy jej możliwości konfiguracji. Jednym ze sposób na formułowanie własnej konfiguracji testów jest stworzenie nowej klasy, która musi dziedziczyć z klasy ManualConfig. Następnie w konstruktorze nowej klasy, definiujemy zachowanie się testu. Ponadto w parametrze metody, która uruchamia testy, podajemy własną konfigurację:

BenchmarkRunner.Run<StringBuildVsStringTest>(new StringBuildVsStringTestConfig());

Jobs

Opisują jak dany test ma przebiegać- na jakiej platformie (x86, x64), jaki runtime (CLR, Core, Mono), ile razy się wykonywać, itp. Jednak według dokumentacji twórców, lepiej nie ustawiać liczby przebiegów testów, ponieważ zaimplementowali inteligentny algorytm, który dobierze odpowiednią liczbę powtórzeń.

Exporters

Definiują w jakich formatach ma zostać zapisany wynik i jak bardzo szczegółowy. Przykładowa konfiguracja:

Columns

Określają jakie kolumny mają znaleźć się w podsumowaniu.

Wynik:

BenchmarkDotNetSummary2

Inny zapis konfiguracji

Biblioteka oferuje również możliwość tworzenia konfiguracji, w którym nie musimy tworzyć nowej klasy. Przykładowa implementacja:

Podsumowanie

Biblioteka oferuje spore możliwości konfiguracji, w których możemy ustawiać wiele różnych cech testu. Jednak największą jej zaletą jest gotowość do działania zaraz po „wyjęciu z pudełka”. Nie musimy dodawać wielu linii kodu- wystarczy dopisać tylko jeden atrybut i mamy dostęp do wielu różnych statystyk.

Reklamy

3 uwagi do wpisu “Mierzenie wydajności kodu za pomocą BenchmarkDotNet

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

w

Connecting to %s