JEEConf 2016. Effectiveness and code optimization in Java applications

Preview:

Citation preview

Effectiveness and code optimization

in Java applications

Sergey MorenetsMay, 21 2016

SPEAKER

FOUNDER

DEVELOPER 12 YEARS

TRAINER 4 YEARS

WRITER 3 BOOKS

Spring Data Vs JDBC

Preface

JDBC

Agenda

AgendaWhat is effectiveness?Code optimizationJVM optimizationCode samplesMeasurements

Ideal code

Concise Readable Self-describing

Reusable Testable Modern

Flexible Scalable Effective

EffectivenessHard to determine on code/design review stages or in unit-testsCannot be defined in development environmentOptimization is interactivePremature optimization is evilHardware-specificThe only aspect of the ideal code that affects users

OptimizationDeveloper

Java compiler

JIT compiler

JVM

Premature optimization

Premature optimization

Premature optimization

Premature optimization

Premature optimization

Effectiveness

CPU usage

Memory footprint

Network I/O utilization

Disk I/O utilization

TuningJVM optionsMetaspace/heap/stack sizeGarbage collector optionshttp://blog.sokolenko.me/2014/11/javavm-options-production.htmlhttp://www.javaspecialists.eu/

Why is it important?

Time-consumin

g processes

Big data

Real-time systems

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

MeasurementsJMH is micro benchmarking frameworkDeveloped by Oracle engineersFirst release in 2013Requires build tool(Maven, Gradle)Can measure throughput or average timeIncludes warm-up periodPart of Java 9

Measurements

Warm-up

EnvironmentJMH 1.12Maven 3.3.9JDK 1.8.0.91Intel Core i7, 4 cores, 16 GB

Method vs Field

Method vs Field

1,95 ns1,93 ns

Strings

Strings

7,62 ns

13,4 ns

7,32 ns

7,24 ns

Conditions

Conditions

2,05 ns

2,03 ns

Strings

Strings

Measurements

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

Strings

Strings

Measurements

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

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

Autoboxing

Measurements

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

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

Sample

Lists

Measurements

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

381707

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

144814

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

292364

Comparison

Operations ArrayList LinkedList

AddDeleteGetIterate

Comparison

Comparison

Measurements

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

632 754 873

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

874 483

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

Lightweight

Hashing strategies

Primitive types

Hash table improvemen

ts

Measurements

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

LIFO

LIFO

LinkedList

Stack

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

Mapping

Mapping

Mapping

Measurements

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

Mapping

Measurements

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

Loops vs Streams

Loops vs Streams

Measurements

Type 10 elements(ns)

1000 elements

100000 elements

For-each

85 8002 766765

Stream 147 11784 1103383

ConclusionCompiler and JIT optimizationSpeed and memory optimizationPrefer ArrayList/HashMapUse measurement tools

Theory

EnterpriseWeb server performanceDatabase programmingORM & DI frameworksREST servicesBuild management systems

Q&A

• Sergey Morenets, sergey.morenets@gmail.com

Recommended