101
Заголовок презентации Имя и фамилия автора доклада Компания Контактные данные 1 Контактные данные 2 Контактные данные 3 Контактные данные 4 Effectiveness and code optimization in Java applications Sergey Morenets [email protected]

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

  • Upload
    fwdays

  • View
    787

  • Download
    20

Embed Size (px)

Citation preview

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

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

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

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

Effectiveness and code optimization in Java applicationsSergey [email protected]

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

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

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

Preface

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

Agenda

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

Agenda

• What is effectiveness?• Code optimization• JVM optimization• Code samples• Measurements

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

Ideal code

Concise Readable Self-describing

Reusable Testable Modern

Flexible Scalable Effective

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

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

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

Effectiveness

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

Premature optimization

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

Premature optimization

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

Premature optimization

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

Premature optimization

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

Premature optimization

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

Premature optimization

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

Effectiveness

CPU utilization

Memory utilization

Network I/O utilization

Disk I/O utilization

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

Effectiveness

• Can be measured• Can be static or dynamic• Can be tuned

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

Tuning

• JVM options• Metaspace/heap/stack size• Garbage collector options• http://

blog.sokolenko.me/2014/11/javavm-options-production.html

• http://www.javaspecialists.eu/

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

Code optimization

Java compiler

JIT compiler

JVM

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

Code optimization

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

Code optimization

public int execute(); Code: 0: iconst_2 1: istore_1 2: iinc 1, 1 5: iconst_1 6: ireturn

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

Code optimization

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

Code optimization

public int execute(); Code: 0: iconst_2 1: istore_1 2: iconst_1 3: ireturn

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

Code optimization

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

Code optimization

public void execute(); Code: 0: return

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

Code optimization

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

Code optimization

public static boolean get(); Code: 0: iconst_1 1: ireturn

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

Code optimization

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

Code optimization

public void execute(); Code: 0: return

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

Code optimization

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

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

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

Code optimization

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

Code optimization

public int execute(); Code: 0: bipush 6 2: ireturn

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

Code optimization

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

Code optimization

public int execute(); Code: 0: bipush 12 2: ireturn

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

Java compiler

Dead code elimination

Constant folding

Fixed expression calculation

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

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

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

Warm-up

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

Environment

• JMH 1.11.3• Maven 3.3.9• JDK 1.8.0.73• Intel Core i7 4790, 4 cores, 16 GB

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

Measurements

Type Time(ns)Multiply 4 2,025Shift 2,024

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

Measurements

Type Time(ns)Multiply 17 2,04Shift 2,04

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

Method vs Field

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

Measurements

Type Time(ns)Field 1,945Method 1,933

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

Inversion

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

Inversion

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

Measurements

Type Time(ns)! 1,99? 1,99^ 2,01

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

Arrays

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

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

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

Arrays

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

Measurements

Type Time(ns)For (10 elements) 5,04For optimized(10 elements) 5,07For (1000 elements) 258,9For-each (1000 elements) 258,7

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

Arrays

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

Measurements

Type Time(ns)Sequential (10 elements) 5Parallel (10 elements) 6230Sequential (1000 elements) 263Parallel (1000 elements) 8688Sequential (50000 elements) 13115Parallel (50000 elements) 34695

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

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

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

Autoboxing

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

Measurements

Type Time(ns)Array(100 elements) 58List(100 elements) 390Array(10 000 elements) 4776List(10 000 elements) 48449

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

LIFO

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

LIFO

Stack

LinkedList

ArrayDeque

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

Stack

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

Java NIO

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

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

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

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

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

Collections

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

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

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

Reflection

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

Measurements

Type Time(ns)New object 3,0Reflection 5,4

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

Reflection

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

Measurements

Type Time(ns)Method call 0,3Reflection 232

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

Measurements

Type Time(ns)Method call 0,3Reflection (cached) 3,1

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

Lists

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

Measurements

Type Time(ns)ArrayList (1000 elements) 4766ArrayList (100 000 elements) 381707LinkedList (1000 elements) 5504LinkedList (100 000 elements) 504231

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

Lists

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

Measurements

Type Time(ns)ArrayList (1000 elements) 26767ArrayList (100 000 elements) 276(ms)LinkedList (1000 elements) 300971LinkedList (100 000 elements) 3424(ms)

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

Lists

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

Measurements

Type Time(ns)ArrayList (1000 elements) 774ArrayList (100 000 elements) 144814LinkedList (1000 elements) 2161LinkedList (100 000 elements) 292364

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

Comparison

Operations ArrayList LinkedListAddDeleteGetIterate

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

Speed Memory footprint

Big data structures

I/O support

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

Measurements

Type (elements) Time(ns)ArrayList (1000) 4732ArrayList (100 000) 387692LinkedList (1000) 5775LinkedList (100 000) 511646ObjectArrayList(1000) 3168ObjectArrayList(100 000) 322811

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

Synchronization. Java 1.0

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

Measurements

Type(1 thread) Time(ns)Not synchronized 2,0Synchronized method 18,3Synchronized block 18,3

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

Synchronization. Java 5

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

Synchronization. Java 5

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

Synchronization. Java 8

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

Measurements

Type (1 thread) Time(ns)ReentrantLock 18,7ReadWriteLock 19,0StampedLock 18,6

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

Synchronization

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

Measurements

Type (16 threads) Time(ns)ReentrantLock 54,2ReadWriteLock 56,4StampedLock 52,5AtomicLong 8,8

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

Java 7

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

Java 8

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

Java 8

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

Measurements

Type Time(ns)Anonymous class 2,03Lambda expression 2,37Method reference 2,38

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

Java 7

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

Java 8

Page 93: "Эффективность и оптимизация кода в 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

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

Parallel streams

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

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

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

Default methods

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

Measurements

Type Time(ns)Class 2,13Interface 2,39

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

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

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

Conclusion

• Compiler and JIT optimization• Speed and memory optimization• Prefer ArrayList/HashMap• Synchronization and reflection cost• Use measurement tools

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

Theory