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