Effective Java
applications
Sergey Morenets, morenets@mail.ru
October, 27 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
Agenda
Agenda
• What is effectiveness?
• Code samples
• Measurements
• Optimization
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
Effectiveness
CPU
utilization
Memory
utilization
Network I/O
utilization
Disk I/O
utilization
Effectiveness
• Can be measured
• Can be static and dynamic
• Can be tuned
Tuning
• JVM options
• Metaspace/heap/stack size
• Garbage collector options
• http://blog.sokolenko.me/2014/11/javavm-options-
production.html
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
Sample
Samples
Measurements
Type Time(ns)
Addiction 2,06
Incrementation 2,06
Samples
Measurements
Type Time(ns)
Standard 2,10
Addiction 2,08
XOR 2,04
Samples
Measurements
Type Time(ns)
Ternary operation 2,05
If operator 2,03
Samples
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
Samples
Measurements
Type Time(ns)
+ 7,62
Concat 13,4
StringBuffer 7,32
StringBuilder 7,24
Samples
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
Samples
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
Samples
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
Samples
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
Samples
Samples
Measurements
Type Time(ns)
Parse(1000 tokens) 12239
Parse with intern(1000 tokens) 72814
Samples
Samples
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
Samples
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
Samples
Samples
Measurements
Type Time(ns)
New ArrayList() 3,6
emptyList() 2,4
LIFO
LIFO
Stack
LinkedList
ArrayDeque
Samples
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
Samples
Measurements
Type Time(ns)
New object 3,0
Reflection 5,4
Samples
Measurements
Type Time(ns)
Method call 0,3
Reflection 232
Measurements
Type Time(ns)
Method call 0,3
Reflection (cached) 3,1
Sample
Sample
Measurements
Type Time(ns)
ArrayList (1000 elements) 4766
ArrayList (100 000 elements) 381707
LinkedList (1000 elements) 5504
LinkedList (100 000 elements) 504231
Theory
Q&A
• Sergey Morenets, morenets@mail.ru

Effective Java applications