Upload
strannik2013
View
625
Download
0
Embed Size (px)
Citation preview
About author• Works in IT since 2000• 12 year of Java SE/EE experience• Regular speaker at Java conferences• Author of “Development of Java applications” and
“Main errors in Java programming ”books• Founder of http://it-simulator.com
Preface
Agenda
Agenda• What is effectiveness?• Code optimization• JVM optimization• Code samples• Measurements
Ideal code
Concise Readable Self-describing
Reusable Testable Modern
Flexible Scalable Effective
Effectiveness• Hard to determine on code/design review stages
or in unit-tests• Is relevant for the specific project configuration• Cannot be defined in development environment• Depends on the application environment• Premature optimization is evil• Hardware-specific• The only aspect of the ideal code that affects
users
Premature optimization
Premature optimization
Premature optimization
Premature optimization
Premature optimization
Effectiveness
CPU utilization
Memory utilization
Network I/O
utilizationDisk I/O
utilization
Effectiveness• Can be measured• Can be static or dynamic• Can be tuned
Tuning• JVM options• Metaspace/heap/stack size• Garbage collector options• http://
blog.sokolenko.me/2014/11/javavm-options-production.html
• http://www.javaspecialists.eu/
Code optimization
Java compiler
JIT compiler
JVM
Code optimization
Code optimization public int execute(); Code: 0: iconst_2 1: istore_1 2: iinc 1, 1 5: iconst_1 6: ireturn
Code optimization
Code optimization public int execute(); Code: 0: iconst_2 1: istore_1 2: iconst_1 3: ireturn
Code optimization
Code optimization public void execute(); Code: 0: return
Code optimization
Code optimization public static boolean get(); Code: 0: iconst_1 1: ireturn
Code optimization
Code optimization public void execute(); Code: 0: return
Code optimization
Code optimization public int execute(); Code: 0: iconst_2 1: istore_1 2: iconst_4 3: istore_2 4: iload_1 5: iload_2 6: iadd 7: ireturn
Code optimization
Code optimization public int execute(); Code: 0: bipush 6 2: ireturn
Code optimization
Code optimization public int execute(); Code: 0: bipush 12 2: ireturn
Java compiler
Dead code elimination
Constant folding
Fixed expression calculation
Measurements• JMH is micro benchmarking framework• Developed by Oracle engineers• First release in 2013• Requires build tool(Maven, Gradle)• Can measure throughput or average time• Includes warm-up period
Warm-up
Environment• JMH 1.11.1• Maven 3.3.3• JDK 1.8.0.65• Intel Core i7, 4 cores, 16 GB
Measurements
Type Time(ns)Multiply 4 2,025Shift 2,024
Measurements
Type Time(ns)Multiply 17 2,04Shift 2,04
Sample
Method vs Field
Measurements
Type Time(ns)Field 1,945Method 1,933
Measurements
Type Time(ns)Static 2,17Instance 2,30
Increment
Measurements
Type Time(ns)Addiction 2,06Incrementation 2,06
Swap
Measurements
Type Time(ns)Standard 2,10Addiction 2,08XOR 2,04
Conditions
Measurements
Type Time(ns)Ternary operation 2,05If operator 2,03
Parsing
Measurements
Type Time(ns)Long usage(small numbers) 3Long usage(average numbers)
19
Long usage(big numbers) 33Long usage (not a number) 849Regexp (small numbers) 58Regexp (average numbers) 75Regexp (big numbers) 82Regexp (not a number) 47
Copying arrays
Measurements
Type Time(ns)Loop(1000 elements) 52,6arrayCopy(1000 elements) 45,6Loop(100 000 elements) 21666arrayCopy(100 000 elements)
21707
Loop(10 000 000 elements) 6432557arrayCopy(10 000 000 elements)
6616976
Measurements
Type Time(ns)Rows(10 elements) 37Columns(10 elements) 67Rows(100 elements) 2954Columns(100 elements) 5567Rows(1000 elements) 264340Columns(1000 elements) 1300244Rows(5000 elements) 9,6(ms)Columns(5000 elements) 387(ms)
Strings
Measurements
Type Time(ns)+ 7,62Concat 13,4StringBuffer 7,32StringBuilder 7,24
Maps
Measurements
Type Time(ns)Entries (10 pairs) 30Keys/Values(10 pairs) 70Entries (1000 pairs) 2793Keys/Values(1000 pairs) 8798Entries (200 000 pairs) 237652Keys/Values(200 000 pairs) 350821
Arrays
Measurements
Type Time(ns)For (10 elements) 4,9For-each (10 elements) 5,1For (1000 elements) 260For-each (1000 elements) 259,9For (50000 elements) 12957For-each (50000 elements) 12958
Arrays
Measurements
Type Time(ns)For (10 elements) 5,04For optimized(10 elements)
5,07
For (1000 elements) 258,9For-each (1000 elements) 258,7
Arrays
Measurements
Type Time(ns)Sequential (10 elements) 5Parallel (10 elements) 6230Sequential (1000 elements) 263Parallel (1000 elements) 8688Sequential (50000 elements)
13115
Parallel (50000 elements) 34695
MeasurementsType Time(ns)Sequential (10 elements) 5Parallel (10 elements) 6230Sequential (1000 elements) 263Parallel (1000 elements) 8688Sequential (50000 elements)
13115
Parallel (50000 elements) 34695Sequential (5 000 000 elements)
1 765 206
Parallel (5 000 000 elements)
2 668 564
Sequential (500 000 000) 183 msParallel (500 000 000) 174 ms
Exceptions
Measurements
Type Time(ns)If 2,40Exceptions 2,47
Strings
Strings
Measurements
Type Time(ns)Parse(1000 tokens) 12239Parse with intern(1000 tokens)
72814
Arrays
Bitset
Measurements
Type Time(ns)Fill array (1000 elements) 148Fill bit set(1000 elements) 1520Fill array (50 000 elements) 4669Fill bit set(50 000 elements)
71395
Bitset
Measurements
Type Time(ns)Fill array (1000 elements) 148Fill bit set(1000 elements) 261Fill array (50 000 elements) 4669Fill bit set(50 000 elements)
12758
Collections
Collections
Measurements
Type Time(ns)New ArrayList() 3,6emptyList() 2,4
Autoboxing
Measurements
Type Time(ns)Array(100 elements) 58List(100 elements) 390Array(10 000 elements) 4776List(10 000 elements) 48449
LIFO
LIFOStack
LinkedList
ArrayDeque
Stack
Measurements
Type Time(ns)Stack(1000 elements) 5729LinkedList(1000 elements) 7928ArrayDeque(1000 elements)
4366
Stack(100 000 elements) 588770LinkedList(100 000 elements)
773684
ArrayDeque(100 000 elements)
484280
Collections
Collections
Type Time(ns)Fill HashMap(1000 elements) 16000Fill TreeMap(1000 elements) 40115Fill HashMap(100 000 elements)
2 027 116
Fill TreeMap(100 000 elements)
11 195 422
Iteration HashMap(1000 elements)
3086
Iteration TreeMap(1000 elements)
5038
Reflection
Reflection
Type Time(ns)instanceof 2,266isAssignableFrom 2,146== 2,401
Reflection
Measurements
Type Time(ns)New object 3,0Reflection 5,4
Reflection
Measurements
Type Time(ns)Method call 0,3Reflection 232
Measurements
Type Time(ns)Method call 0,3Reflection (cached) 3,1
Cloning
Measurements
Type Time(ns)Clone 6,5Direct copying 3,8
Sample
Lists
Measurements
Type Time(ns)ArrayList (1000 elements) 4766ArrayList (100 000 elements)
381707
LinkedList (1000 elements) 5504LinkedList (100 000 elements)
504231
JIT optimization• Inline methods• Eliminate locks• Replace interface with direct method calls• Join synchronized blocks• Eliminate dead code• Drop memory write for non-volatile variables
Theory