KEMBAR78
Effectiveness and code optimization in Java | PPTX
Effectiveness and code optimization
in Java
Sergey Morenets, sergey.morenets@gmail.com
December, 4 2015
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
utilization
Disk 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
Javacompiler
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,025
Shift 2,024
Measurements
Type Time(ns)
Multiply 17 2,04
Shift 2,04
Sample
Method vs Field
Measurements
Type Time(ns)
Field 1,945
Method 1,933
Measurements
Type Time(ns)
Static 2,17
Instance 2,30
Increment
Measurements
Type Time(ns)
Addiction 2,06
Incrementation 2,06
Swap
Measurements
Type Time(ns)
Standard 2,10
Addiction 2,08
XOR 2,04
Conditions
Measurements
Type Time(ns)
Ternary operation 2,05
If operator 2,03
Parsing
Measurements
Type Time(ns)
Long usage(small numbers) 3
Long usage(average numbers) 19
Long usage(big numbers) 33
Long usage (not a number) 849
Regexp (small numbers) 58
Regexp (average numbers) 75
Regexp (big numbers) 82
Regexp (not a number) 47
Copying arrays
Measurements
Type Time(ns)
Loop(1000 elements) 52,6
arrayCopy(1000 elements) 45,6
Loop(100 000 elements) 21666
arrayCopy(100 000 elements) 21707
Loop(10 000 000 elements) 6432557
arrayCopy(10 000 000 elements) 6616976
Measurements
Type Time(ns)
Rows(10 elements) 37
Columns(10 elements) 67
Rows(100 elements) 2954
Columns(100 elements) 5567
Rows(1000 elements) 264340
Columns(1000 elements) 1300244
Rows(5000 elements) 9,6(ms)
Columns(5000 elements) 387(ms)
Strings
Measurements
Type Time(ns)
+ 7,62
Concat 13,4
StringBuffer 7,32
StringBuilder 7,24
Maps
Measurements
Type Time(ns)
Entries (10 pairs) 30
Keys/Values(10 pairs) 70
Entries (1000 pairs) 2793
Keys/Values(1000 pairs) 8798
Entries (200 000 pairs) 237652
Keys/Values(200 000 pairs) 350821
Arrays
Measurements
Type Time(ns)
For (10 elements) 4,9
For-each (10 elements) 5,1
For (1000 elements) 260
For-each (1000 elements) 259,9
For (50000 elements) 12957
For-each (50000 elements) 12958
Arrays
Measurements
Type Time(ns)
For (10 elements) 5,04
For optimized(10 elements) 5,07
For (1000 elements) 258,9
For-each (1000 elements) 258,7
Arrays
Measurements
Type Time(ns)
Sequential (10 elements) 5
Parallel (10 elements) 6230
Sequential (1000 elements) 263
Parallel (1000 elements) 8688
Sequential (50000 elements) 13115
Parallel (50000 elements) 34695
Measurements
Type Time(ns)
Sequential (10 elements) 5
Parallel (10 elements) 6230
Sequential (1000 elements) 263
Parallel (1000 elements) 8688
Sequential (50000 elements) 13115
Parallel (50000 elements) 34695
Sequential (5 000 000 elements) 1 765 206
Parallel (5 000 000 elements) 2 668 564
Sequential (500 000 000) 183 ms
Parallel (500 000 000) 174 ms
Exceptions
Measurements
Type Time(ns)
If 2,40
Exceptions 2,47
Strings
Strings
Measurements
Type Time(ns)
Parse(1000 tokens) 12239
Parse with intern(1000 tokens) 72814
Arrays
Bitset
Measurements
Type Time(ns)
Fill array (1000 elements) 148
Fill bit set(1000 elements) 1520
Fill array (50 000 elements) 4669
Fill bit set(50 000 elements) 71395
Bitset
Measurements
Type Time(ns)
Fill array (1000 elements) 148
Fill bit set(1000 elements) 261
Fill array (50 000 elements) 4669
Fill bit set(50 000 elements) 12758
Collections
Collections
Measurements
Type Time(ns)
New ArrayList() 3,6
emptyList() 2,4
Autoboxing
Measurements
Type Time(ns)
Array(100 elements) 58
List(100 elements) 390
Array(10 000 elements) 4776
List(10 000 elements) 48449
LIFO
LIFO
Stack
LinkedList
ArrayDeque
Stack
Measurements
Type Time(ns)
Stack(1000 elements) 5729
LinkedList(1000 elements) 7928
ArrayDeque(1000 elements) 4366
Stack(100 000 elements) 588770
LinkedList(100 000 elements) 773684
ArrayDeque(100 000 elements) 484280
Collections
Collections
Type Time(ns)
Fill HashMap(1000 elements) 16000
Fill TreeMap(1000 elements) 40115
Fill 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,266
isAssignableFrom 2,146
== 2,401
Reflection
Measurements
Type Time(ns)
New object 3,0
Reflection 5,4
Reflection
Measurements
Type Time(ns)
Method call 0,3
Reflection 232
Measurements
Type Time(ns)
Method call 0,3
Reflection (cached) 3,1
Cloning
Measurements
Type Time(ns)
Clone 6,5
Direct copying 3,8
Sample
Lists
Measurements
Type Time(ns)
ArrayList (1000 elements) 4766
ArrayList (100 000 elements) 381707
LinkedList (1000 elements) 5504
LinkedList (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
Q&A
• Sergey Morenets, sergey.morenets@gmail.com

Effectiveness and code optimization in Java