Effectiveness and code optimization in Java

Preview:

Citation preview

Effectiveness and code optimization

in Java

Sergey Morenets, sergey.morenets@gmail.comDecember, 4 2015

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• Cannot be defined in development environment• Depends on the application environment• Premature optimization is evil• Hardware-specific• The only aspect of the ideal code that affects

users

Premature optimization

Premature optimization

Premature optimization

Premature optimization

Premature optimization

Effectiveness

CPU utilization

Memory utilization

Network I/O

utilizationDisk 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• First release in 2013• Requires build tool(Maven, Gradle)• Can measure throughput or average time• Includes warm-up period

Warm-up

Environment• JMH 1.11.1• Maven 3.3.3• JDK 1.8.0.65• Intel Core i7, 4 cores, 16 GB

Measurements

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

Measurements

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

Sample

Method vs Field

Measurements

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

Measurements

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

Increment

Measurements

Type Time(ns)Addiction 2,06Incrementation 2,06

Swap

Measurements

Type Time(ns)Standard 2,10Addiction 2,08XOR 2,04

Conditions

Measurements

Type Time(ns)Ternary operation 2,05If operator 2,03

Parsing

Measurements

Type Time(ns)Long usage(small numbers) 3Long usage(average numbers)

19

Long usage(big numbers) 33Long usage (not a number) 849Regexp (small numbers) 58Regexp (average numbers) 75Regexp (big numbers) 82Regexp (not a number) 47

Copying arrays

Measurements

Type Time(ns)Loop(1000 elements) 52,6arrayCopy(1000 elements) 45,6Loop(100 000 elements) 21666arrayCopy(100 000 elements)

21707

Loop(10 000 000 elements) 6432557arrayCopy(10 000 000 elements)

6616976

Measurements

Type Time(ns)Rows(10 elements) 37Columns(10 elements) 67Rows(100 elements) 2954Columns(100 elements) 5567Rows(1000 elements) 264340Columns(1000 elements) 1300244Rows(5000 elements) 9,6(ms)Columns(5000 elements) 387(ms)

Strings

Measurements

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

Maps

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

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,07

For (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)

13115

Parallel (50000 elements) 34695

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

Exceptions

Measurements

Type Time(ns)If 2,40Exceptions 2,47

Strings

Strings

Measurements

Type Time(ns)Parse(1000 tokens) 12239Parse with intern(1000 tokens)

72814

Arrays

Bitset

Measurements

Type Time(ns)Fill array (1000 elements) 148Fill bit set(1000 elements) 1520Fill array (50 000 elements) 4669Fill bit set(50 000 elements)

71395

Bitset

Measurements

Type Time(ns)Fill array (1000 elements) 148Fill bit set(1000 elements) 261Fill array (50 000 elements) 4669Fill bit set(50 000 elements)

12758

Collections

Collections

Measurements

Type Time(ns)New ArrayList() 3,6emptyList() 2,4

Autoboxing

Measurements

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

LIFO

LIFOStack

LinkedList

ArrayDeque

Stack

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

Collections

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

Reflection

Reflection

Type Time(ns)instanceof 2,266isAssignableFrom 2,146== 2,401

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

Cloning

Measurements

Type Time(ns)Clone 6,5Direct copying 3,8

Sample

Lists

Measurements

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

381707

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

504231

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

Theory

Q&A

• Sergey Morenets, sergey.morenets@gmail.com

Recommended