Testowanie Wydajności Kodu za pomocą Narzędzia JMH

Slides:



Advertisements
Podobne prezentacje
Wstęp do programowania
Advertisements

Programowanie wielowątkowe
Jarosław Kuchta Monitory.
Programowanie obiektowe
Wskaźniki repetytorium Wskaźniki int Y = 1, X = 2; X = 5; int *p = &X; Y X p 4 4 p = &Y; *p = 4; 5.
PL/SQL kompilacja warunkowa
Generics w .NET 2.0 Łukasz Rzeszot.
Bezpieczeństwo wyjątków w C++: OpenGL
Copyright © 2006 Quest Software Wybrane Narzędzia z Oferty Quest Software Dedykowane dla Baz Danych MACIEJ POGORZELSKI.
Tworzenie i obsługa programów – przykład 3 uwagi cd. Wykorzystując różne klasy biblioteki języka Java należy pamiętać w jakim pakiecie się znajdują. Wszystkie.
Nguyen Hung Son Uniwersytet Warszawski
Podstawy języka Java Nguyen Hung Son Uniwersytet Warszawski.
Marcin Pamuła Mateusz Stefek
Wielodziedziczenie od środka Konrad Lipiński
RMI I RMI-IIOP Wprowadzenie Co to jest RMI?
Bartosz Walter Inżynieria oprogramowania Lecture XXX JavaTM – część II Bartosz Walter
Czyli jak testować w Eclipsie?
Systemy operacyjne Wykład nr 5: Wątki Piotr Bilski.
Enteprise Java Beans Emil Wcisło.
Project made by Bartosz Rumiński Kl. III i rok 2007/2008.
Dr Anna Kwiatkowska JAVA dr Anna Kwiatkowska
Język Java Wielowątkowość.
przygotował Michał Wdaniec
Test Doubles Adam Gabryś , v1.1,
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
Integracja aplikacji Wykład 2
Rozwój aplikacji. To zestaw narzędzi do budowania i optymalizacji złożonych aplikacji opartych na przeglądarce. To zestaw narzędzi do budowania i optymalizacji.
Generatory dokumentacji kodu źródłowego
Wykorzystanie mechanizmu delegata do emulacji struktury i zachowania widżetów w architekturze Model/Widok biblioteki Qt4 Wytłumaczyc temat: Ja: W bibliotekach.
Programowanie obiektowe III rok EiT
Google Testing Radosław Smilgin, , TestWarez.
Programowanie obiektowe – zastosowanie języka Java SE
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Inicjalizacja i sprzątanie
Seminarium problemowe
Maszyna wirtualna ang. virtual machine, VM.
Java 3 MPDI Programowanie obiektowe W5. Java - obiektowy język programowania stworzony przez firmę Sun Microsystems. Java jest językiem tworzenia programów.
  ELEMENTY JĘZYKA JAVA komentarze w Javie, słowa kluczowe i operatory, proste typy danych, tablice, podstawowy zestaw instrukcji.
Programowanie strukturalne i obiektowe C++
Responsywne aplikacje w Windows 8 i.NET 4.5 Jakub Binkowski.
Java profiler based on byte code analysis and instrumentation for apdaptation the source code in many-core hardware accelerators Marcin Pietroń, Dominik.
Model współbieżności w Javie autor: Grzegorz Szuba.
Model współbieżności w Javie
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej Programowanie wielowątkowe w Javie Wykład 9 mgr inż. Michał Misiak.
Programowanie sieciowe w Javie Michał Kuciapski
Wdrożenie Foglight w Urzędzie Dozoru Technicznego
Object-relational mapping (aka O/RM, ORM, and O/R mapping)
Temat: Porównanie technologii php,c# oraz javascript na przykładzie webaplikacji typu społecznościowy agregator treści Autor: Wojciech Ślawski.
Elementy programowania funkcyjnego w Javie 8. Pragmatyczny przegląd. (c) Krzysztof Barteczko 2014.
Typy i metody sparametryzowane (generics) (c) Krzysztof Barteczko 2014.
Metody analizy wydajności i precyzji oprogramowania Wojciech Matuszewski.
Tworzenie dokumentacji w systemie Doxygen Paweł Strużyński 25 maja 2011.
Eclipse jako środowisko IDE do programowania w Javie Java IDE Bartosz.Michalik
.NET Core Łukasz Co to takiego? Nowy, open-sourcowy framework pozwalający na pisanie cross-platformowych aplikacji z użyciem.NET.
Kompilacja iteracyjna Piotr Błaszyński. Szybkie programy Prawa ograniczające:  prawo Moore'a (jego granice),  prawo Gatesa,  prawo Amdahla,  prawo.
Optymalizacja programów Open-Source
Wątki, programowanie współbieżne
(według:
Programowanie Obiektowe – Wykład 2
Klasy wewnętrzne. Praktyka użycia interfejsów i klas wewnętrznych
AOP – Aspect Oriented Programming
Programowanie obiektowe – zastosowanie języka Java SE
Podstawy programowania
Założenia projektowe Javy
NEMERLE Michał Maliszewski.
BYDGOSKI FESTIWAL NAUKI
Zastosowanie tzw reaktywności w aplikacjach.
Programowanie w Javie 1 Dr Robert Kowalczyk
Java 11 Bogusław Matysik.
Tworzenie wątków w Javie
Zapis prezentacji:

Testowanie Wydajności Kodu za pomocą Narzędzia JMH Wojciech Oczkowski

O czym będziemy mówić Czym są benchmarki i w czym mogą nam pomóc Jakie są problemy z mierzeniem wydajności kodu Javy Jak JMH pozwala uniknąć typowych błędów Praktyczne przykłady

Wojciech Oczkowski >> 20 lat programowania dla przyjemności >> 10 lat zawodowego programowania w Javie Branże: Obronna, telco / call-center, finansowa Szkolenia Wydajność, Architektura, Integracja Właściciel IT Kontekst Lider Bydgoszcz JUG Aktywny członek Toruń JUG Ojciec, mąż, żeglarz

Benchmarki Porównywanie wydajności alternatywnych rozwiązań Sprawdzanie wydajności bez konieczności budowy całego rozwiązania Eksperymentowanie z nowymi rozwiązaniami Tuning Benchmarki - testy rozwiązań skupione na mierzeniu i porównywaniu ich wydajności.

Co w tym trudnego? long start = System.currentTimeMillis(); work(); System.out.println( System.currentTimeMillis() - start); Nawet najlepsi się na tym wykładali Choć trzeba przyznać że czasy wtedy były inne. (wersja javy, wydajność sprzętu)

what could possibly go wrong? Pomiar CZASU Ziarnistość pomiaru czasu (~30 ns Linux, ~300 ns Windows [1t]) Ukryty narzut System.nanoTime(); Błąd pomiaru różnice w implementacji timerów w systemach operacyjnych - Najczęściej badanie wydajności opieramy o pomiar czasu Dokładność pomiaru czasu jest jednak ograniczona Chcąc podejść do sprawy profesjonalnie nie możemy skupić się na pojedynczym pomiarze Trzeba określić granice niepewności, odchylenie standardowe itp., jest do tego cała teoria opisana np. w monografii GUM.

what could possibly go wrong? Optymalizacje kompilatora - pętle Rozwijanie pętli Piplineing long start = System.nanoTime(); for (int i = 0; i < 100000; i++) { work(); } System.out.println((System.nanoTime() - start)/100000);

what could possibly go wrong what could possibly go wrong? Optymalizacje kompilatora – Dead Code ELIMINATION public void measuredMethod(){ // start measurement int result = work(); // end of measurement }

what could possibly go wrong what could possibly go wrong? Optymalizacje kompilatora – COnSTANT FOLDING public int measuredMethod(){ // start measurement return 42 + work(); // end of measurement }

what could possibly go wrong? FALSE Sharing int someCounter; int completelyDifferentCounter; // on Thread 1 public int measuredMethod1(){ return work(someCounter); } // on Thread 2 public int measuredMethod2(){ return work(completelyDifferentCounter); }

what could possibly go wrong? Warm up -XX:CompileThreshold=[1500,2000,10000] -XX:-PrintCompilation -XX:MaxInlineSize=35 -XX:+PrintInlining -XX:LoopUnrollLimit=n -zależy od charakterystyki aplikacji -czasami interesuje nas worst case bo spodziewamy się że nie będzie czasu na warmup

what could possibly go wrong? Różnice systemów operacyjnych Różnice w implementacji JVM Różnice timerów Różnice scheduler’ów 32 vs 64 bit Niektóre optymalizacje dostępne są dla wybranych OS’ów Niektóre bug’i też ;)

Czym jest JMH i jak może pomóc Narzędzie do budowania benchmarków Pomaga w uniknięciu typowych problemów Nie zwalnia z myślenia o nich. Java -> org.openjdk.jmh:jmh-java-benchmark-archetype Scala -> org.openjdk.jmh:jmh-scala-benchmark-archetype -> sbt-jmh plugin Groovy -> org.openjdk.jmh:jmh-groovy-benchmark-archetype Kotlin -> org.openjdk.jmh:jmh-java-benchmark-archetype

Nowy benchmark package pl.itkontekst.jmhtest; import org.openjdk.jmh.annotations.Benchmark; public class MyBenchmark { @Benchmark public void testMethod(){ }

# JMH 1.14.1 (released 13 days ago) # VM version: JDK 1.8.0_77, VM 25.77-b03 # VM invoker: C:\Program Files\Java\jre1.8.0_77\bin\java.exe # VM options: <none> # Warmup: 20 iterations, 1 s each # Measurement: 20 iterations, 1 s each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Throughput, ops/time # Benchmark: pl.itkontekst.jmhtest.MyBenchmark.testMethod # Run progress: 0,00% complete, ETA 00:06:40 # Fork: 1 of 10 # Warmup Iteration 1: 3321638210,400 ops/s # Warmup Iteration 2: 3035709856,963 ops/s … Iteration 19: 3292590873,371 ops/s Iteration 20: 3352591339,138 ops/s Result "testMethod": 3336940878,008 ?(99.9%) 21593035,964 ops/s [Average] (min, avg, max) = (2837336846,716, 3336940878,008, 3433712311,191), stdev = 91426266,353 CI (99.9%): [3315347842,045, 3358533913,972] (assumes normal distribution) # Run complete. Total time: 00:06:43 Benchmark Mode Cnt Score Error Units MyBenchmark.testMethod thrpt 200 3336940878,008 ? 21593035,964 ops/s

Opcje pomiarów @Fork(1) @Warmup(iterations = 5) @Measurement(iterations = 5) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) public class MyBenchmark { @Benchmark public void testMethod() { } }

Klasy Stanu, setup, parametry, Black Hole @State(Scope.Benchmark) public static class MyState { @Param({"1","2","3"}) int value; @Setup public void init(){} } @Benchmark public void testAdd(Blackhole blackhole,MyState state) { blackhole.consume(state.value+state.value); Blackhole.consumeCPU(10); } @Benchmark public void testMethod(Blackhole blackhole) { Blackhole.consumeCPU(10); }

Wątki, Grupy, Padding @Threads(4) public class MyBenchmark { @State(Scope.Benchmark) public static class MyState { @Param({"2"}) int value; } @State(Scope.Benchmark) public static class MyState2 { @Param({"1"}) int value2; } @Benchmark @Group("add") public void testAdd(Blackhole blackhole,MyState state) { blackhole.consume(state.value+state.value); } @Benchmark @Group("add") public void testAdd2(Blackhole blackhole,MyState2 state) { blackhole.consume(state.value2+state.value2); } }

Kontrola pracy kompilatora @CompilerControl(CompilerControl.Mode.DONT_INLINE) public void testDontInline(){} @CompilerControl(CompilerControl.Mode.INLINE) public void testForceInline(){} @CompilerControl(CompilerControl.Mode.EXCLUDE) public void testDontCompile(){}

Programowa kontrola uruchamiania public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder() .include(MyBenchmark.class.getSimpleName()) .warmupIterations(1) .measurementIterations(3) .forks(1) .build(); new Runner(opt).run(); }

Profilery java -jar benchmarks.jar -lprof Supported profilers: cl: Classloader profiling via standard MBeans comp: JIT compiler profiling via standard MBeans gc: GC profiling via standard MBeans hs_cl: HotSpot (tm) classloader profiling via implementation-specific MBeans hs_comp: HotSpot (tm) JIT compiler profiling via implementation-specific MBeans hs_gc: HotSpot (tm) memory manager (GC) profiling via implementation-specific MBeans hs_rt: HotSpot (tm) runtime profiling via implementation-specific MBeans hs_thr: HotSpot (tm) threading subsystem via implementation-specific MBeans pauses: Pauses profiler perf: Linux perf Statistics perfasm: Linux perf + PrintAssembly Profiler perfnorm: Linux perf statistics, normalized by operation count stack: Simple and naive Java stack profiler Unsupported profilers: xperfasm: <none>

Profilery Stack profiler: ....[Thread state distributions].................................................................... 97,2% RUNNABLE 2,8% WAITING ....[Thread state: RUNNABLE]........................................................................ 56,8% 58,5% pl.itkontekst.jmhtest.MyBenchmark.testAdd 39,8% 41,0% pl.itkontekst.jmhtest.generated.MyBenchmark_add_jmhTest.testAdd_thrpt_jmhStub 0,3% 0,3% sun.misc.Unsafe.compareAndSwapInt 0,1% 0,1% java.lang.Thread.currentThread 0,1% 0,1% sun.misc.Unsafe.unpark ....[Thread state: WAITING]......................................................................... 2,8% 100,0% sun.misc.Unsafe.park

Wyniki java -jar benchmarks.jar -lrf Available formats: text, csv, scsv, json, latex java -jar benchmarks.jar -rff output.csv

PODSUMOWANIE Pisanie Benchmarków nie jest trywialne JMH pomaga w unikaniu typowych problemów ale nie zwalnia z myślenia o nich JMH nie zastąpi ostatecznych testów wydajnościowych JIT to potężny oręż, który może Ci obciąć rękę kiedy nie będziesz uważny

Warto posłuchać / poczytać JMH Samples  http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/ Aleksey Shipilëv – dzieła wybrane Jarosław Pałka – dzieła wybrane Charlie Hunt – dzieła wybrane Scott Oaks – dzieła wybrane Kirk Pepperdine – dzieła wybrane

Pytania?