"Эффективность и оптимизация кода в Java 8" Сергей...

Preview:

Citation preview

Заголовок презентации

Имя и фамилия автора докладаКомпания

Контактные данные 1Контактные данные 2Контактные данные 3Контактные данные 4

Effectiveness and code optimization in Java applicationsSergey Morenetssergey.morenets@gmail.com

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, sergey.morenets@gmail.com

Recommended