java/scala lab 2016. Сергей Моренец: Способы повышения...

93
Effectiveness and code optimization in Java applications Sergey Morenets, [email protected] April, 16 2016

Upload: geekslab

Post on 16-Jan-2017

213 views

Category:

Software


4 download

TRANSCRIPT

Page 1: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Effectiveness and code optimization

in Java applications

Sergey Morenets, [email protected], 16 2016

Page 2: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

About author• Works in IT since 2000• 13 year of Java SE/EE experience• Regular speaker at Java conferences• Author of “Development of Java applications”,

“Main errors in Java programming” and “Ideal code” books

• Founder of http://it-simulator.com• Java trainer and lector

Page 3: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

IT-Discovery

Курсы Тренинги

Семинары

Мастер-классы

Page 4: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Preface

Page 5: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

JDBC

Page 6: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8
Page 7: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8
Page 8: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Agenda

Page 9: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

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

Page 10: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Ideal code

Concise Readable

Self-describing Reusable

Testable Modern

Flexible Scalable

Effective

Page 11: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

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• Premature optimization is evil• Hardware-specific• The only aspect of the ideal code that affects

users

Page 12: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Premature optimization

Page 13: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Premature optimization

Page 14: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Premature optimization

Page 15: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Premature optimization

Page 16: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Premature optimization

Page 17: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Premature optimization

Page 18: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Effectiveness

CPU utilization

Memory utilization

Network I/O

utilizationDisk I/O

utilization

Page 19: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в 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 20: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Why is it important?• Real-time systems• Time-consuming systems• Large volume data

Page 21: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Code optimization

Java compiler

JIT compiler

JVM

Page 22: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Code optimization

Page 23: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

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

Page 24: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Code optimization

Page 25: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

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

Page 26: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Code optimization

Page 27: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Code optimization public void execute(); Code: 0: return

Page 28: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Code optimization

Page 29: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

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

Page 30: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Code optimization

Page 31: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Code optimization public void execute(); Code: 0: return

Page 32: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Code optimization

Page 33: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в 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 34: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Code optimization

Page 35: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

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

Page 36: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Java

co

mpi

ler Dead code elimination

Constant folding

Fixed expression calculation

Page 37: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

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

Page 38: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

Page 39: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Warm-up

Page 40: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Environment• JMH 1.11.3• Maven 3.3.9• JDK 1.8.0.77• Intel Core i7, 4 cores, 16 GB

Page 41: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

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

Page 42: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Sample

Page 43: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Method vs Field

Page 44: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

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

Page 45: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8
Page 46: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

Type Time(ns)Static 2,17Instance 2,30

Page 47: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Strings

Page 48: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

Type Time(ns)+ 7,62Concat 13,4StringBuffer 7,32StringBuilder 7,24

Page 49: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Strings

Page 50: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Strings

Page 51: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

Type(characters) Time(ns)Multiple(3) 627Single(3) 284Multiple(30) 773Single(30) 387

Page 52: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Strings

Page 53: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Strings

Page 54: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

Type(characters) Time(ns)Multiple(3) 634Single(3) 283Pattern(3) 151

Page 55: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Maps

Page 56: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

Type Time(ns)Entries (10 pairs) 30Keys/Values(10 pairs) 70Entries (1000 pairs) 2793Keys/Values(1000 pairs) 8798Entries (200 000 pairs) 237652Keys/Values(200 000 pairs) 350821

Page 57: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Arrays

Page 58: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в 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 59: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Arrays

Page 60: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

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

13115

Parallel (50000 elements) 34695

Page 61: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

MeasurementsType Time(ns)Sequential (10 elements) 5Parallel (10 elements) 6230Sequential (1000 elements) 263Parallel (1000 elements) 8688Sequential (50000 elements)

13115

Parallel (50000 elements) 34695Sequential (5 000 000 elements)

1 765 206

Parallel (5 000 000 elements)

2 668 564

Sequential (500 000 000) 183 msParallel (500 000 000) 174 ms

Page 62: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Autoboxing

Page 63: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

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

Page 64: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Collections

Page 65: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Collections

Type Time(ns)Fill HashMap(1000 elements) 16000Fill TreeMap(1000 elements) 40115Fill 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

Page 66: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Sample

Page 67: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Lists

Page 68: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

Type Time(ns)ArrayList (1000 elements) 4766ArrayList (100 000 elements)

381707

LinkedList (1000 elements) 5504LinkedList (100 000 elements)

504231

Page 69: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Lists

Page 70: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в 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 71: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Lists

Page 72: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

Type Time(ns)ArrayList (1000 elements) 774ArrayList (100 000 elements)

144814

LinkedList (1000 elements) 2161LinkedList (100 000 elements)

292364

Page 73: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Comparison

Operations ArrayList LinkedList

AddDeleteGetIterate

Page 74: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Comparison

Page 75: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Comparison

Page 76: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

Type Time(ns)ArrayList (1000 elements) 49710ArrayList (100 000 elements)

632 754 873

LinkedList (1000 elements) 8507LinkedList (100 000 elements)

874 483

Page 77: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Speed Memory footprint

Big data structur

esI/O

support

Page 78: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в 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/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Lightweight Hashing strategies

Primitive types

Hash table improvemen

ts

Page 80: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

Type (elements) Time(ns)ArrayList (1000) 4595ArrayList (100 000) 394645ObjectArrayList(1000) 328363ObjectArrayList(100 000) 3187TIntArrayList(1000) 189608TIntArrayList(100 000) 1925

Page 81: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

LIFO

Page 82: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

LIFO

Stack

LinkedList

ArrayDeque

Page 83: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Stack

Page 84: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

Type Time(ns)Stack(1000 elements) 5729LinkedList(1000 elements) 7928ArrayDeque(1000 elements)

4366

Stack(100 000 elements) 588770LinkedList(100 000 elements)

773684

ArrayDeque(100 000 elements)

484280

Page 85: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Mapping

Page 86: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Mapping

Page 87: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Mapping

Page 88: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

Type Time(ns)HashMap 4,60EnumMap 3,40

Page 89: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Mapping

Page 90: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Measurements

Type Time(ns)HashMap 4,53EnumMap 3,40Direct usage 2,36

Page 91: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Conclusion• Compiler and JIT optimization• Speed and memory optimization• Prefer ArrayList/HashMap• Use measurement tools

Page 92: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Theory

Page 93: Java/Scala Lab 2016. Сергей Моренец: Способы повышения эффективности в Java 8

Q&A

• Sergey Morenets, [email protected]