SlideShare a Scribd company logo
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
CO W TYM TRUDNEGO?
long start = System.currentTimeMillis();
work();
System.out.println(
System.currentTimeMillis() - start);
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
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?
OPTYMALIZACJE KOMPILATORA – DEAD CODE ELIMINATION
public void measuredMethod(){
// start measurement
int result = work();
// end of measurement
}
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
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 FilesJavajre1.8.0_77binjava.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Ć
• 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
JMH Samples  http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-
samples/src/main/java/org/openjdk/jmh/samples/
PYTANIA?

More Related Content

What's hot

MS - Wprowadzenie do testów jednostkowych
MS - Wprowadzenie do testów jednostkowychMS - Wprowadzenie do testów jednostkowych
MS - Wprowadzenie do testów jednostkowych
Marcin Samsonowski
 
Analiza TestLink - narzędzie do zarzadzania testowaniem
Analiza TestLink - narzędzie do zarzadzania testowaniemAnaliza TestLink - narzędzie do zarzadzania testowaniem
Analiza TestLink - narzędzie do zarzadzania testowaniem
Radoslaw Smilgin
 
Interoperability Testing
Interoperability TestingInteroperability Testing
Interoperability Testing
kraqa
 
Narzędzie zarządzania testowaniem. Badanie TestRail.
Narzędzie zarządzania testowaniem. Badanie TestRail.Narzędzie zarządzania testowaniem. Badanie TestRail.
Narzędzie zarządzania testowaniem. Badanie TestRail.
Radoslaw Smilgin
 
Więcej testów/mniej kodu - Michał Gaworski, kraQA 13
Więcej testów/mniej kodu - Michał Gaworski, kraQA 13Więcej testów/mniej kodu - Michał Gaworski, kraQA 13
Więcej testów/mniej kodu - Michał Gaworski, kraQA 13
kraqa
 
Automation of functional tests using JMeter (in Polish)
Automation of functional tests using JMeter (in Polish)Automation of functional tests using JMeter (in Polish)
Automation of functional tests using JMeter (in Polish)
Tieto Corporation
 
JMeter - narzędzie testera - notatki
JMeter - narzędzie testera - notatkiJMeter - narzędzie testera - notatki
JMeter - narzędzie testera - notatki
Stowarzyszenie Jakości Systemów Informatycznych (SJSI)
 
Narzedzia zarządzania testowaniem. Badanie - SynapseRT
Narzedzia zarządzania testowaniem. Badanie - SynapseRTNarzedzia zarządzania testowaniem. Badanie - SynapseRT
Narzedzia zarządzania testowaniem. Badanie - SynapseRT
Radoslaw Smilgin
 
Poznańska grupa .Net spotkanie VI - Test Driven Development
Poznańska grupa .Net spotkanie VI - Test Driven DevelopmentPoznańska grupa .Net spotkanie VI - Test Driven Development
Poznańska grupa .Net spotkanie VI - Test Driven Developmentbartlomiej.szafko
 
Monika Braun - "Tester i frameworki agilowe - rola testera w różnych metodyka...
Monika Braun - "Tester i frameworki agilowe - rola testera w różnych metodyka...Monika Braun - "Tester i frameworki agilowe - rola testera w różnych metodyka...
Monika Braun - "Tester i frameworki agilowe - rola testera w różnych metodyka...
kraqa
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
kraqa
 
Adam Roman, Dariusz Drezno - "Studia podyplomowe z testowania oprogramowania ...
Adam Roman, Dariusz Drezno - "Studia podyplomowe z testowania oprogramowania ...Adam Roman, Dariusz Drezno - "Studia podyplomowe z testowania oprogramowania ...
Adam Roman, Dariusz Drezno - "Studia podyplomowe z testowania oprogramowania ...
kraqa
 
Narzedzia zarządzania testowaniem. Badanie SpiraTest
Narzedzia zarządzania testowaniem. Badanie SpiraTestNarzedzia zarządzania testowaniem. Badanie SpiraTest
Narzedzia zarządzania testowaniem. Badanie SpiraTestRadoslaw Smilgin
 
Narzędzia zarzadzania testowaniem - analiza rynku
Narzędzia zarzadzania testowaniem - analiza rynkuNarzędzia zarzadzania testowaniem - analiza rynku
Narzędzia zarzadzania testowaniem - analiza rynku
Radoslaw Smilgin
 
Context Driven School of testing w prostych przykładach
Context Driven School of testing w prostych przykładachContext Driven School of testing w prostych przykładach
Context Driven School of testing w prostych przykładach
Radoslaw Smilgin
 
4Developers 2018: Unit testing - introduction (Marek Kawczyński)
4Developers 2018: Unit testing - introduction (Marek Kawczyński)4Developers 2018: Unit testing - introduction (Marek Kawczyński)
4Developers 2018: Unit testing - introduction (Marek Kawczyński)
PROIDEA
 
Narzedzia zarządzania testowaniem.Wyniki.
Narzedzia zarządzania testowaniem.Wyniki.Narzedzia zarządzania testowaniem.Wyniki.
Narzedzia zarządzania testowaniem.Wyniki.
Radoslaw Smilgin
 
Crowdsourcing testowania aplikacji i serwisów webowych, czyli testowanie 2.0
Crowdsourcing testowania aplikacji i serwisów webowych, czyli testowanie 2.0Crowdsourcing testowania aplikacji i serwisów webowych, czyli testowanie 2.0
Crowdsourcing testowania aplikacji i serwisów webowych, czyli testowanie 2.0
Damian Szczurek
 

What's hot (18)

MS - Wprowadzenie do testów jednostkowych
MS - Wprowadzenie do testów jednostkowychMS - Wprowadzenie do testów jednostkowych
MS - Wprowadzenie do testów jednostkowych
 
Analiza TestLink - narzędzie do zarzadzania testowaniem
Analiza TestLink - narzędzie do zarzadzania testowaniemAnaliza TestLink - narzędzie do zarzadzania testowaniem
Analiza TestLink - narzędzie do zarzadzania testowaniem
 
Interoperability Testing
Interoperability TestingInteroperability Testing
Interoperability Testing
 
Narzędzie zarządzania testowaniem. Badanie TestRail.
Narzędzie zarządzania testowaniem. Badanie TestRail.Narzędzie zarządzania testowaniem. Badanie TestRail.
Narzędzie zarządzania testowaniem. Badanie TestRail.
 
Więcej testów/mniej kodu - Michał Gaworski, kraQA 13
Więcej testów/mniej kodu - Michał Gaworski, kraQA 13Więcej testów/mniej kodu - Michał Gaworski, kraQA 13
Więcej testów/mniej kodu - Michał Gaworski, kraQA 13
 
Automation of functional tests using JMeter (in Polish)
Automation of functional tests using JMeter (in Polish)Automation of functional tests using JMeter (in Polish)
Automation of functional tests using JMeter (in Polish)
 
JMeter - narzędzie testera - notatki
JMeter - narzędzie testera - notatkiJMeter - narzędzie testera - notatki
JMeter - narzędzie testera - notatki
 
Narzedzia zarządzania testowaniem. Badanie - SynapseRT
Narzedzia zarządzania testowaniem. Badanie - SynapseRTNarzedzia zarządzania testowaniem. Badanie - SynapseRT
Narzedzia zarządzania testowaniem. Badanie - SynapseRT
 
Poznańska grupa .Net spotkanie VI - Test Driven Development
Poznańska grupa .Net spotkanie VI - Test Driven DevelopmentPoznańska grupa .Net spotkanie VI - Test Driven Development
Poznańska grupa .Net spotkanie VI - Test Driven Development
 
Monika Braun - "Tester i frameworki agilowe - rola testera w różnych metodyka...
Monika Braun - "Tester i frameworki agilowe - rola testera w różnych metodyka...Monika Braun - "Tester i frameworki agilowe - rola testera w różnych metodyka...
Monika Braun - "Tester i frameworki agilowe - rola testera w różnych metodyka...
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Adam Roman, Dariusz Drezno - "Studia podyplomowe z testowania oprogramowania ...
Adam Roman, Dariusz Drezno - "Studia podyplomowe z testowania oprogramowania ...Adam Roman, Dariusz Drezno - "Studia podyplomowe z testowania oprogramowania ...
Adam Roman, Dariusz Drezno - "Studia podyplomowe z testowania oprogramowania ...
 
Narzedzia zarządzania testowaniem. Badanie SpiraTest
Narzedzia zarządzania testowaniem. Badanie SpiraTestNarzedzia zarządzania testowaniem. Badanie SpiraTest
Narzedzia zarządzania testowaniem. Badanie SpiraTest
 
Narzędzia zarzadzania testowaniem - analiza rynku
Narzędzia zarzadzania testowaniem - analiza rynkuNarzędzia zarzadzania testowaniem - analiza rynku
Narzędzia zarzadzania testowaniem - analiza rynku
 
Context Driven School of testing w prostych przykładach
Context Driven School of testing w prostych przykładachContext Driven School of testing w prostych przykładach
Context Driven School of testing w prostych przykładach
 
4Developers 2018: Unit testing - introduction (Marek Kawczyński)
4Developers 2018: Unit testing - introduction (Marek Kawczyński)4Developers 2018: Unit testing - introduction (Marek Kawczyński)
4Developers 2018: Unit testing - introduction (Marek Kawczyński)
 
Narzedzia zarządzania testowaniem.Wyniki.
Narzedzia zarządzania testowaniem.Wyniki.Narzedzia zarządzania testowaniem.Wyniki.
Narzedzia zarządzania testowaniem.Wyniki.
 
Crowdsourcing testowania aplikacji i serwisów webowych, czyli testowanie 2.0
Crowdsourcing testowania aplikacji i serwisów webowych, czyli testowanie 2.0Crowdsourcing testowania aplikacji i serwisów webowych, czyli testowanie 2.0
Crowdsourcing testowania aplikacji i serwisów webowych, czyli testowanie 2.0
 

Viewers also liked

JDD 2016 - Michal Matloka - Small Intro To Big Data
JDD 2016 - Michal Matloka - Small Intro To Big DataJDD 2016 - Michal Matloka - Small Intro To Big Data
JDD 2016 - Michal Matloka - Small Intro To Big Data
PROIDEA
 
JDD 2016 - Tomasz Gagor, Pawel Torbus - A Needle In A Logstack
JDD 2016 - Tomasz Gagor, Pawel Torbus - A Needle In A LogstackJDD 2016 - Tomasz Gagor, Pawel Torbus - A Needle In A Logstack
JDD 2016 - Tomasz Gagor, Pawel Torbus - A Needle In A Logstack
PROIDEA
 
Do you think you're doing microservice architecture? What about infrastructur...
Do you think you're doing microservice architecture? What about infrastructur...Do you think you're doing microservice architecture? What about infrastructur...
Do you think you're doing microservice architecture? What about infrastructur...
Marcin Grzejszczak
 
PLNOG 18 - Michał Sajdak - IoT hacking w praktyce
PLNOG 18 - Michał Sajdak - IoT hacking w praktycePLNOG 18 - Michał Sajdak - IoT hacking w praktyce
PLNOG 18 - Michał Sajdak - IoT hacking w praktyce
PROIDEA
 
4Developers: Mateusz Stasch- Domain Events - czyli jak radzić sobie z rzeczyw...
4Developers: Mateusz Stasch- Domain Events - czyli jak radzić sobie z rzeczyw...4Developers: Mateusz Stasch- Domain Events - czyli jak radzić sobie z rzeczyw...
4Developers: Mateusz Stasch- Domain Events - czyli jak radzić sobie z rzeczyw...
PROIDEA
 
JDD 2016 - Tomasz Borek - DB for next project? Why, Postgres, of course
JDD 2016 - Tomasz Borek - DB for next project? Why, Postgres, of course JDD 2016 - Tomasz Borek - DB for next project? Why, Postgres, of course
JDD 2016 - Tomasz Borek - DB for next project? Why, Postgres, of course
PROIDEA
 
2016 - Daniel Lebrero - REPL driven development
2016 - Daniel Lebrero - REPL driven development2016 - Daniel Lebrero - REPL driven development
2016 - Daniel Lebrero - REPL driven development
PROIDEA
 
JDD 2016 - Christin Gorman - Concurrency in Java
JDD 2016 - Christin Gorman - Concurrency in JavaJDD 2016 - Christin Gorman - Concurrency in Java
JDD 2016 - Christin Gorman - Concurrency in Java
PROIDEA
 
JDD 2016 - Pawel Byszewski - Kotlin, why?
JDD 2016 - Pawel Byszewski - Kotlin, why?JDD 2016 - Pawel Byszewski - Kotlin, why?
JDD 2016 - Pawel Byszewski - Kotlin, why?
PROIDEA
 
JDD 2016 - Pawel Szulc - Writing Your Wwn RDD For Fun And Profit
JDD 2016 - Pawel Szulc - Writing Your Wwn RDD For Fun And ProfitJDD 2016 - Pawel Szulc - Writing Your Wwn RDD For Fun And Profit
JDD 2016 - Pawel Szulc - Writing Your Wwn RDD For Fun And Profit
PROIDEA
 
JDD 2016 - Grzegorz Piwowarek - Davaslang - Functional Java Done Right
JDD 2016 - Grzegorz Piwowarek - Davaslang - Functional Java Done RightJDD 2016 - Grzegorz Piwowarek - Davaslang - Functional Java Done Right
JDD 2016 - Grzegorz Piwowarek - Davaslang - Functional Java Done Right
PROIDEA
 
JDD 2016 - Grzegorz Rozniecki - Java 8 What Could Possibly Go Wrong
JDD 2016 - Grzegorz Rozniecki - Java 8 What Could Possibly Go WrongJDD 2016 - Grzegorz Rozniecki - Java 8 What Could Possibly Go Wrong
JDD 2016 - Grzegorz Rozniecki - Java 8 What Could Possibly Go Wrong
PROIDEA
 
PLNOG 18 - Alan Kuczewski - "Mały może więcej" - Rozwiązanie wysokiej dostępn...
PLNOG 18 - Alan Kuczewski - "Mały może więcej" - Rozwiązanie wysokiej dostępn...PLNOG 18 - Alan Kuczewski - "Mały może więcej" - Rozwiązanie wysokiej dostępn...
PLNOG 18 - Alan Kuczewski - "Mały może więcej" - Rozwiązanie wysokiej dostępn...
PROIDEA
 
PLNOG 18 - Marcin Kuczera- ONT idealny
PLNOG 18 - Marcin Kuczera- ONT idealny PLNOG 18 - Marcin Kuczera- ONT idealny
PLNOG 18 - Marcin Kuczera- ONT idealny
PROIDEA
 
JDD 2016 - Michał Balinski, Oleksandr Goldobin - Practical Non Blocking Micro...
JDD 2016 - Michał Balinski, Oleksandr Goldobin - Practical Non Blocking Micro...JDD 2016 - Michał Balinski, Oleksandr Goldobin - Practical Non Blocking Micro...
JDD 2016 - Michał Balinski, Oleksandr Goldobin - Practical Non Blocking Micro...
PROIDEA
 
4Developers: Aplikacja od SaaSa do IdaaSa
4Developers: Aplikacja od SaaSa do IdaaSa4Developers: Aplikacja od SaaSa do IdaaSa
4Developers: Aplikacja od SaaSa do IdaaSa
Tomek Onyszko
 

Viewers also liked (16)

JDD 2016 - Michal Matloka - Small Intro To Big Data
JDD 2016 - Michal Matloka - Small Intro To Big DataJDD 2016 - Michal Matloka - Small Intro To Big Data
JDD 2016 - Michal Matloka - Small Intro To Big Data
 
JDD 2016 - Tomasz Gagor, Pawel Torbus - A Needle In A Logstack
JDD 2016 - Tomasz Gagor, Pawel Torbus - A Needle In A LogstackJDD 2016 - Tomasz Gagor, Pawel Torbus - A Needle In A Logstack
JDD 2016 - Tomasz Gagor, Pawel Torbus - A Needle In A Logstack
 
Do you think you're doing microservice architecture? What about infrastructur...
Do you think you're doing microservice architecture? What about infrastructur...Do you think you're doing microservice architecture? What about infrastructur...
Do you think you're doing microservice architecture? What about infrastructur...
 
PLNOG 18 - Michał Sajdak - IoT hacking w praktyce
PLNOG 18 - Michał Sajdak - IoT hacking w praktycePLNOG 18 - Michał Sajdak - IoT hacking w praktyce
PLNOG 18 - Michał Sajdak - IoT hacking w praktyce
 
4Developers: Mateusz Stasch- Domain Events - czyli jak radzić sobie z rzeczyw...
4Developers: Mateusz Stasch- Domain Events - czyli jak radzić sobie z rzeczyw...4Developers: Mateusz Stasch- Domain Events - czyli jak radzić sobie z rzeczyw...
4Developers: Mateusz Stasch- Domain Events - czyli jak radzić sobie z rzeczyw...
 
JDD 2016 - Tomasz Borek - DB for next project? Why, Postgres, of course
JDD 2016 - Tomasz Borek - DB for next project? Why, Postgres, of course JDD 2016 - Tomasz Borek - DB for next project? Why, Postgres, of course
JDD 2016 - Tomasz Borek - DB for next project? Why, Postgres, of course
 
2016 - Daniel Lebrero - REPL driven development
2016 - Daniel Lebrero - REPL driven development2016 - Daniel Lebrero - REPL driven development
2016 - Daniel Lebrero - REPL driven development
 
JDD 2016 - Christin Gorman - Concurrency in Java
JDD 2016 - Christin Gorman - Concurrency in JavaJDD 2016 - Christin Gorman - Concurrency in Java
JDD 2016 - Christin Gorman - Concurrency in Java
 
JDD 2016 - Pawel Byszewski - Kotlin, why?
JDD 2016 - Pawel Byszewski - Kotlin, why?JDD 2016 - Pawel Byszewski - Kotlin, why?
JDD 2016 - Pawel Byszewski - Kotlin, why?
 
JDD 2016 - Pawel Szulc - Writing Your Wwn RDD For Fun And Profit
JDD 2016 - Pawel Szulc - Writing Your Wwn RDD For Fun And ProfitJDD 2016 - Pawel Szulc - Writing Your Wwn RDD For Fun And Profit
JDD 2016 - Pawel Szulc - Writing Your Wwn RDD For Fun And Profit
 
JDD 2016 - Grzegorz Piwowarek - Davaslang - Functional Java Done Right
JDD 2016 - Grzegorz Piwowarek - Davaslang - Functional Java Done RightJDD 2016 - Grzegorz Piwowarek - Davaslang - Functional Java Done Right
JDD 2016 - Grzegorz Piwowarek - Davaslang - Functional Java Done Right
 
JDD 2016 - Grzegorz Rozniecki - Java 8 What Could Possibly Go Wrong
JDD 2016 - Grzegorz Rozniecki - Java 8 What Could Possibly Go WrongJDD 2016 - Grzegorz Rozniecki - Java 8 What Could Possibly Go Wrong
JDD 2016 - Grzegorz Rozniecki - Java 8 What Could Possibly Go Wrong
 
PLNOG 18 - Alan Kuczewski - "Mały może więcej" - Rozwiązanie wysokiej dostępn...
PLNOG 18 - Alan Kuczewski - "Mały może więcej" - Rozwiązanie wysokiej dostępn...PLNOG 18 - Alan Kuczewski - "Mały może więcej" - Rozwiązanie wysokiej dostępn...
PLNOG 18 - Alan Kuczewski - "Mały może więcej" - Rozwiązanie wysokiej dostępn...
 
PLNOG 18 - Marcin Kuczera- ONT idealny
PLNOG 18 - Marcin Kuczera- ONT idealny PLNOG 18 - Marcin Kuczera- ONT idealny
PLNOG 18 - Marcin Kuczera- ONT idealny
 
JDD 2016 - Michał Balinski, Oleksandr Goldobin - Practical Non Blocking Micro...
JDD 2016 - Michał Balinski, Oleksandr Goldobin - Practical Non Blocking Micro...JDD 2016 - Michał Balinski, Oleksandr Goldobin - Practical Non Blocking Micro...
JDD 2016 - Michał Balinski, Oleksandr Goldobin - Practical Non Blocking Micro...
 
4Developers: Aplikacja od SaaSa do IdaaSa
4Developers: Aplikacja od SaaSa do IdaaSa4Developers: Aplikacja od SaaSa do IdaaSa
4Developers: Aplikacja od SaaSa do IdaaSa
 

Similar to JDD 2016 - Wojciech Oczkowski - Testowanie Wydajnosci Za Pomoca Narzedzia JMH

Podstawy testowania oprogramowania INCO 2023.pptx
Podstawy testowania oprogramowania INCO 2023.pptxPodstawy testowania oprogramowania INCO 2023.pptx
Podstawy testowania oprogramowania INCO 2023.pptx
Katarzyna Javaheri-Szpak
 
Wprowadzenie do PHPUnit
Wprowadzenie do PHPUnitWprowadzenie do PHPUnit
Wprowadzenie do PHPUnit
Michał Kowalik
 
Testowanie automatyczne 2024 INCO Academy
Testowanie automatyczne 2024 INCO AcademyTestowanie automatyczne 2024 INCO Academy
Testowanie automatyczne 2024 INCO Academy
Katarzyna Javaheri-Szpak
 
Automatyzacja w praktyce. Praktyka automatyzacji
Automatyzacja w praktyce. Praktyka automatyzacjiAutomatyzacja w praktyce. Praktyka automatyzacji
Automatyzacja w praktyce. Praktyka automatyzacji
Radoslaw Smilgin
 
Praktyczne code reviews - PHPConPl
Praktyczne code reviews - PHPConPlPraktyczne code reviews - PHPConPl
Praktyczne code reviews - PHPConPl
Sebastian Marek
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatyczny
qbeuek
 
university day 1
university day 1university day 1
university day 1
Sławomir Borowiec
 
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
kraqa
 
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVMKopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Artur Skowroński
 
Konrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gier
Konrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gierKonrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gier
Konrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gier
GameDesire Academy
 
Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014
Tomasz Dziuda
 
[TestWarez 2017] Zen testów wydajnościowych
[TestWarez 2017] Zen testów wydajnościowych[TestWarez 2017] Zen testów wydajnościowych
[TestWarez 2017] Zen testów wydajnościowych
Stowarzyszenie Jakości Systemów Informatycznych (SJSI)
 
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Droptica
 
Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?
javOnet
 
Wprowadzenie do testów wydajnościowych w k6
Wprowadzenie do testów wydajnościowych w k6Wprowadzenie do testów wydajnościowych w k6
Wprowadzenie do testów wydajnościowych w k6
The Software House
 
Perl. Testowanie. Zapiski programisty
Perl. Testowanie. Zapiski programistyPerl. Testowanie. Zapiski programisty
Perl. Testowanie. Zapiski programisty
Wydawnictwo Helion
 
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof ŚlusarskiWJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
Krzysztof Ślusarski
 
PHPUnit - jak zacząć pisać testy automatyczne [PL]
PHPUnit - jak zacząć pisać testy automatyczne [PL]PHPUnit - jak zacząć pisać testy automatyczne [PL]
PHPUnit - jak zacząć pisać testy automatyczne [PL]
Droptica
 
Refaktoryzacja
RefaktoryzacjaRefaktoryzacja
Refaktoryzacja
PHPstokPHPstok
 
CDI Portable Extensions
CDI Portable ExtensionsCDI Portable Extensions
CDI Portable Extensions
Adam Warski
 

Similar to JDD 2016 - Wojciech Oczkowski - Testowanie Wydajnosci Za Pomoca Narzedzia JMH (20)

Podstawy testowania oprogramowania INCO 2023.pptx
Podstawy testowania oprogramowania INCO 2023.pptxPodstawy testowania oprogramowania INCO 2023.pptx
Podstawy testowania oprogramowania INCO 2023.pptx
 
Wprowadzenie do PHPUnit
Wprowadzenie do PHPUnitWprowadzenie do PHPUnit
Wprowadzenie do PHPUnit
 
Testowanie automatyczne 2024 INCO Academy
Testowanie automatyczne 2024 INCO AcademyTestowanie automatyczne 2024 INCO Academy
Testowanie automatyczne 2024 INCO Academy
 
Automatyzacja w praktyce. Praktyka automatyzacji
Automatyzacja w praktyce. Praktyka automatyzacjiAutomatyzacja w praktyce. Praktyka automatyzacji
Automatyzacja w praktyce. Praktyka automatyzacji
 
Praktyczne code reviews - PHPConPl
Praktyczne code reviews - PHPConPlPraktyczne code reviews - PHPConPl
Praktyczne code reviews - PHPConPl
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatyczny
 
university day 1
university day 1university day 1
university day 1
 
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
Od Produktywności do Sabotażu - Sławomir Radzymiński, KraQA #31
 
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVMKopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
 
Konrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gier
Konrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gierKonrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gier
Konrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gier
 
Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014Daj się wyręczyć - Joomla Day Polska 2014
Daj się wyręczyć - Joomla Day Polska 2014
 
[TestWarez 2017] Zen testów wydajnościowych
[TestWarez 2017] Zen testów wydajnościowych[TestWarez 2017] Zen testów wydajnościowych
[TestWarez 2017] Zen testów wydajnościowych
 
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
Codeception - jak zacząć pisać automatyczne testy do Drupala [PL]
 
Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?
 
Wprowadzenie do testów wydajnościowych w k6
Wprowadzenie do testów wydajnościowych w k6Wprowadzenie do testów wydajnościowych w k6
Wprowadzenie do testów wydajnościowych w k6
 
Perl. Testowanie. Zapiski programisty
Perl. Testowanie. Zapiski programistyPerl. Testowanie. Zapiski programisty
Perl. Testowanie. Zapiski programisty
 
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof ŚlusarskiWJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
 
PHPUnit - jak zacząć pisać testy automatyczne [PL]
PHPUnit - jak zacząć pisać testy automatyczne [PL]PHPUnit - jak zacząć pisać testy automatyczne [PL]
PHPUnit - jak zacząć pisać testy automatyczne [PL]
 
Refaktoryzacja
RefaktoryzacjaRefaktoryzacja
Refaktoryzacja
 
CDI Portable Extensions
CDI Portable ExtensionsCDI Portable Extensions
CDI Portable Extensions
 

JDD 2016 - Wojciech Oczkowski - Testowanie Wydajnosci Za Pomoca Narzedzia JMH

  • 1. TESTOWANIE WYDAJNOŚCI KODU ZA POMOCĄ NARZĘDZIA JMH WOJCIECH OCZKOWSKI
  • 2. 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
  • 3. 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
  • 4. 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
  • 5. CO W TYM TRUDNEGO? long start = System.currentTimeMillis(); work(); System.out.println( System.currentTimeMillis() - start);
  • 6. 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
  • 7. 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);
  • 8. WHAT COULD POSSIBLY GO WRONG? OPTYMALIZACJE KOMPILATORA – DEAD CODE ELIMINATION public void measuredMethod(){ // start measurement int result = work(); // end of measurement }
  • 9. WHAT COULD POSSIBLY GO WRONG? OPTYMALIZACJE KOMPILATORA – CONSTANT FOLDING public int measuredMethod(){ // start measurement return 42 + work(); // end of measurement }
  • 10. 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); }
  • 11. WHAT COULD POSSIBLY GO WRONG? WARM UP • -XX:CompileThreshold=[1500,2000,10000] • -XX:-PrintCompilation • -XX:MaxInlineSize=35 • -XX:+PrintInlining • -XX:LoopUnrollLimit=n
  • 12. 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ż ;)
  • 13. 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
  • 14. NOWY BENCHMARK package pl.itkontekst.jmhtest; import org.openjdk.jmh.annotations.Benchmark; public class MyBenchmark { @Benchmark public void testMethod(){ } }
  • 15. # JMH 1.14.1 (released 13 days ago) # VM version: JDK 1.8.0_77, VM 25.77-b03 # VM invoker: C:Program FilesJavajre1.8.0_77binjava.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
  • 16. OPCJE POMIARÓW @Fork(1) @Warmup(iterations = 5) @Measurement(iterations = 5) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) public class MyBenchmark { @Benchmark public void testMethod() { } }
  • 17. 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); }
  • 18. 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); } }
  • 19. 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(){}
  • 20. 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(); }
  • 21. 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>
  • 22. 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
  • 23. WYNIKI java -jar benchmarks.jar -lrf Available formats: text, csv, scsv, json, latex java -jar benchmarks.jar -rff output.csv
  • 24. 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
  • 25. WARTO POSŁUCHAĆ / POCZYTAĆ • 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 JMH Samples  http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh- samples/src/main/java/org/openjdk/jmh/samples/

Editor's Notes

  1. Benchmarki - testy rozwiązań skupione na mierzeniu i porównywaniu ich wydajności.
  2. Nawet najlepsi się na tym wykładali Choć trzeba przyznać że czasy wtedy były inne. (wersja javy, wydajność sprzętu)
  3. - 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.
  4. -zależy od charakterystyki aplikacji -czasami interesuje nas worst case bo spodziewamy się że nie będzie czasu na warmup