java/scala lab 2016. Сергей Моренец: Способы повышения...
Post on 16-Jan-2017
216 Views
Preview:
TRANSCRIPT
Effectiveness and code optimization
in Java applications
Sergey Morenets, sergey.morenets@gmail.comApril, 16 2016
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
IT-Discovery
Курсы Тренинги
Семинары
Мастер-классы
Preface
JDBC
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• 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
Premature optimization
Effectiveness
CPU utilization
Memory utilization
Network I/O
utilizationDisk I/O
utilization
Tuning• JVM options• Metaspace/heap/stack size• Garbage collector options• http://
blog.sokolenko.me/2014/11/javavm-options-production.html
• http://www.javaspecialists.eu/
Why is it important?• Real-time systems• Time-consuming systems• Large volume data
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
Java
co
mpi
ler 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
Measurements
Warm-up
Environment• JMH 1.11.3• Maven 3.3.9• JDK 1.8.0.77• Intel Core i7, 4 cores, 16 GB
Measurements
Type Time(ns)Multiply 4 2,025Shift 2,024
Sample
Method vs Field
Measurements
Type Time(ns)Field 1,945Method 1,933
Measurements
Type Time(ns)Static 2,17Instance 2,30
Strings
Measurements
Type Time(ns)+ 7,62Concat 13,4StringBuffer 7,32StringBuilder 7,24
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
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)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 structur
esI/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
Stack
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
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
Conclusion• Compiler and JIT optimization• Speed and memory optimization• Prefer ArrayList/HashMap• Use measurement tools
Theory
top related