Upload
fwdays
View
787
Download
20
Embed Size (px)
Citation preview
Заголовок презентации
Имя и фамилия автора докладаКомпания
Контактные данные 1Контактные данные 2Контактные данные 3Контактные данные 4
Effectiveness and code optimization in Java applicationsSergey [email protected]
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/environment
• Premature optimization is evil• Hardware-specific• The only aspect of the code that affects
users
Effectiveness
Premature optimization
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
Java compiler
Dead code elimination
Constant folding
Fixed expression calculation
Measurements
• JMH is micro benchmarking framework• Developed by Oracle engineers in 2013• Requires build tool(Maven, Gradle)• Can measure throughput or average
time• Includes warm-up period
Warm-up
Environment
• JMH 1.11.3• Maven 3.3.9• JDK 1.8.0.73• Intel Core i7 4790, 4 cores, 16 GB
Measurements
Type Time(ns)Multiply 4 2,025Shift 2,024
Measurements
Type Time(ns)Multiply 17 2,04Shift 2,04
Method vs Field
Measurements
Type Time(ns)Field 1,945Method 1,933
Inversion
Inversion
Measurements
Type Time(ns)! 1,99? 1,99^ 2,01
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,07For (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) 13115Parallel (50000 elements) 34695
Measurements
Type Time(ns)Sequential (10 elements) 5Parallel (10 elements) 6230Sequential (1000 elements) 263Parallel (1000 elements) 8688Sequential (50000 elements) 13115Parallel (50000 elements) 34695Sequential (5 000 000 elements) 1 765 206Parallel (5 000 000 elements) 2 668 564Sequential (500 000 000) 183 msParallel (500 000 000) 174 ms
Autoboxing
Measurements
Type Time(ns)Array(100 elements) 58List(100 elements) 390Array(10 000 elements) 4776List(10 000 elements) 48449
LIFO
LIFO
Stack
LinkedList
ArrayDeque
Stack
Java NIO
Measurements
100 elements Array Heap buffer Direct bufferCreate 13,87 18,9 502,5Get 2,24 3,18 2,65Update 2,26 3,21 2,93Update all 29,5 33,2 36,6
Measurements
10000 elements Array Heap buffer Direct bufferCreate 544 548 1543Get 2,25 3,26 2,77Update 2,38 3,19 2,94Update all 2701 2720 5022
Collections
Collections
Type Time(ns)Fill HashMap(1000 elements) 16000Fill TreeMap(1000 elements) 40115Fill HashMap(100 000 elements) 2 027 116Fill TreeMap(100 000 elements) 11 195 422Iteration HashMap(1000 elements) 3086Iteration TreeMap(1000 elements) 5038
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
Lists
Measurements
Type Time(ns)ArrayList (1000 elements) 4766ArrayList (100 000 elements) 381707LinkedList (1000 elements) 5504LinkedList (100 000 elements) 504231
Lists
Measurements
Type Time(ns)ArrayList (1000 elements) 26767ArrayList (100 000 elements) 276(ms)LinkedList (1000 elements) 300971LinkedList (100 000 elements) 3424(ms)
Lists
Measurements
Type Time(ns)ArrayList (1000 elements) 774ArrayList (100 000 elements) 144814LinkedList (1000 elements) 2161LinkedList (100 000 elements) 292364
Comparison
Operations ArrayList LinkedListAddDeleteGetIterate
Speed Memory footprint
Big data structures
I/O support
Measurements
Type (elements) Time(ns)ArrayList (1000) 4732ArrayList (100 000) 387692LinkedList (1000) 5775LinkedList (100 000) 511646ObjectArrayList(1000) 3168ObjectArrayList(100 000) 322811
Synchronization. Java 1.0
Measurements
Type(1 thread) Time(ns)Not synchronized 2,0Synchronized method 18,3Synchronized block 18,3
Synchronization. Java 5
Synchronization. Java 5
Synchronization. Java 8
Measurements
Type (1 thread) Time(ns)ReentrantLock 18,7ReadWriteLock 19,0StampedLock 18,6
Synchronization
Measurements
Type (16 threads) Time(ns)ReentrantLock 54,2ReadWriteLock 56,4StampedLock 52,5AtomicLong 8,8
Java 7
Java 8
Java 8
Measurements
Type Time(ns)Anonymous class 2,03Lambda expression 2,37Method reference 2,38
Java 7
Java 8
Measurements
Type(# elements) Time(ns)For-loop(10) 5,0Stream(10) 35,2For-loop(1000) 264Stream(1000) 1970For-loop(50 000) 13244Stream(50 000) 95689
Parallel streams
Measurements
Type(# elements) Time(ns)Sum sequential(100) 6Sum parallel(100) 51Sleep sequential(100) 101 106 306Sleep parallel(100) 13 575 733Sum sequential(10000) 19517Sum parallel(10000) 15657Sleep sequential(10000) 10 068 771 891Sleep parallel(10000) 1 250 911 296
Default methods
Measurements
Type Time(ns)Class 2,13Interface 2,39
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
Conclusion
• Compiler and JIT optimization• Speed and memory optimization• Prefer ArrayList/HashMap• Synchronization and reflection cost• Use measurement tools
Theory
Sergey Morenets, [email protected]