Effectiveness and code optimization
in Java applications
Sergey Morenets
May, 21 2016
SPEAKER
FOUNDER
DEVELOPER 12 YEARS
TRAINER 4 YEARS
WRITER 3 BOOKS
Spring Data Vs JDBC
Preface
JDBC
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
Cannot be defined in development environment
Optimization is interactive
Premature optimization is evil
Hardware-specific
The only aspect of the ideal code that affects users
Optimization
Developer
Java compiler
JIT compiler
JVM
Premature optimization
Premature optimization
Premature optimization
Premature optimization
Premature optimization
Effectiveness
CPU usage
Memory
footprint
Network I/O
utilization
Disk I/O
utilization
Tuning
JVM options
Metaspace/heap/stack size
Garbage collector options
http://blog.sokolenko.me/2014/11/javavm-options-
production.html
http://www.javaspecialists.eu/
Why is it important?
Time-
consuming
processes
Big data
Real-time
systems
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 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
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
Part of Java 9
Measurements
Warm-up
Environment
JMH 1.12
Maven 3.3.9
JDK 1.8.0.91
Intel Core i7, 4 cores, 16 GB
Method vs Field
Method vs Field
1,95 ns
1,93 ns
Strings
Strings
7,62 ns
13,4 ns
7,32 ns
7,24 ns
Conditions
Conditions
2,05 ns
2,03 ns
Strings
Strings
Measurements
Type(characters) Time(ns)
Multiple(3) 627
Single(3) 284
Multiple(30) 773
Single(30) 387
Strings
Strings
Measurements
Type(characters) Time(ns)
Multiple(3) 634
Single(3) 283
Pattern(3) 151
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)
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
Autoboxing
Measurements
Type Time(ns)
Array(100 elements) 58
List(100 elements) 390
Array(10 000 elements) 4776
List(10 000 elements) 48449
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
Sample
Lists
Measurements
Type Time(ns)
ArrayList (1000 elements) 4766
ArrayList (100 000 elements) 381707
LinkedList (1000 elements) 5504
LinkedList (100 000 elements) 504231
Lists
Measurements
Type Time(ns)
ArrayList (1000 elements) 26767
ArrayList (100 000 elements) 276(ms)
LinkedList (1000 elements) 300971
LinkedList (100 000 elements) 3424(ms)
Lists
Measurements
Type Time(ns)
ArrayList (1000 elements) 774
ArrayList (100 000 elements) 144814
LinkedList (1000 elements) 2161
LinkedList (100 000 elements) 292364
Comparison
Operations ArrayList LinkedList
Add
Delete
Get
Iterate
Comparison
Comparison
Measurements
Type Time(ns)
ArrayList (1000 elements) 49710
ArrayList (100 000 elements) 632 754 873
LinkedList (1000 elements) 8507
LinkedList (100 000 elements) 874 483
Speed
Memory
footprint
Big data
structures
I/O
support
Measurements
Type (elements) Time(ns)
ArrayList (1000) 4732
ArrayList (100 000) 387692
LinkedList (1000) 5775
LinkedList (100 000) 511646
ObjectArrayList(1000) 3168
ObjectArrayList(100 000) 322811
Lightweight
Hashing
strategies
Primitive
types
Hash table
improvements
Measurements
Type (elements) Time(ns)
ArrayList (1000) 4595
ArrayList (100 000) 394645
ObjectArrayList(1000) 328363
ObjectArrayList(100 000) 3187
TIntArrayList(1000) 189608
TIntArrayList(100 000) 1925
LIFO
LIFO
LinkedList
Stack
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
Mapping
Mapping
Mapping
Measurements
Type Time(ns)
HashMap 4,60
EnumMap 3,40
Mapping
Measurements
Type Time(ns)
HashMap 4,53
EnumMap 3,40
Direct usage 2,36
Loops vs Streams
Loops vs Streams
Measurements
Type 10 elements(ns) 1000 elements 100000 elements
For-each 85 8002 766765
Stream 147 11784 1103383
Conclusion
Compiler and JIT optimization
Speed and memory optimization
Prefer ArrayList/HashMap
Use measurement tools
Theory
Enterprise
Web server performance
Database programming
ORM & DI frameworks
REST services
Build management systems
Q&A
• Sergey Morenets, sergey.morenets@gmail.com

JEEConf 2016. Effectiveness and code optimization in Java applications