Java micro optimizations 2017
-
Upload
dmitriy-dumanskiy -
Category
Engineering
-
view
205 -
download
0
Transcript of Java micro optimizations 2017
![Page 1: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/1.jpg)
Micro optimizations
![Page 2: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/2.jpg)
Dmitriy DumanskiyBlynk, CTO
Java blog : https://habrahabr.ru/users/doom369/topicsDOU : https://dou.ua/users/DOOM/articles/
![Page 3: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/3.jpg)
Makers problem
+ = ?
![Page 4: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/4.jpg)
Blynk
10000 req/sec3 VM * 2 cores, 60$
25% load10k of local installations
![Page 5: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/5.jpg)
Typical Env.
Worst case 256 RAM (~40Mb for heap)700 MHz, 1 core, ARM
![Page 6: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/6.jpg)
● Typical code● Plain java● System is under “highload”● All “issues” are from open-source
Today talk
![Page 7: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/7.jpg)
Problems everybody knows about
![Page 8: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/8.jpg)
● Primitive wrappers
Typical issues
![Page 9: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/9.jpg)
● Primitive wrappers● Boxing / Unboxing
Typical issues
![Page 10: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/10.jpg)
● Primitive wrappers● Boxing / Unboxing● Regex / Pattern matching
Typical issues
![Page 11: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/11.jpg)
● Primitive wrappers● Boxing / Unboxing● Regex / Pattern matching● String concatenation in loops
Typical issues
![Page 12: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/12.jpg)
● Primitive wrappers● Boxing / Unboxing● Regex / Pattern matching● String concatenation in loops● Reflection
Typical issues
![Page 13: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/13.jpg)
![Page 14: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/14.jpg)
class User { Date createdAt;}
What is wrong here?
![Page 15: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/15.jpg)
class User { Date createdAt;}
Memory consumption
![Page 16: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/16.jpg)
class Date { private transient long fastTime; private BaseCalendar.Date cdate;}
More memory
![Page 17: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/17.jpg)
class User { long createdAt;}
Solution
![Page 18: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/18.jpg)
for (String name : list) { //do something}
What is wrong here?
![Page 19: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/19.jpg)
for (String name : list) { //do something}
Iterator allocation
![Page 20: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/20.jpg)
Iterator<String> iter = list.iterator();while (iter.hasNext()) { String name = iter.next();}
Iterator allocation
![Page 21: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/21.jpg)
Scalar replacement. Could be.
Or could be not.
Iterator allocation
![Page 22: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/22.jpg)
for (int i = 0; i < list.size(); i++) { Data data = list.get(i);}
Solution 1
![Page 23: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/23.jpg)
for (String s : array) { //do something}
Solution 2
![Page 24: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/24.jpg)
iterateArray thrpt 168298 ops/siterateListWGet thrpt 132292 ops/siterateList thrpt 110188 ops/s
Iterator
+50%
![Page 25: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/25.jpg)
List<Device> devices = ...;return devices.get(0);
What is wrong here?
![Page 26: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/26.jpg)
List<Device> devices = ...;return devices.get(0);
Polymorphism
![Page 27: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/27.jpg)
invokeInterface
Polymorphism
![Page 28: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/28.jpg)
ArrayList<Device> devices = ...;return devices.get(0);
Solution
![Page 29: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/29.jpg)
arrayListGet thrpt 268418 ops/slistGet thrpt 249005 ops/s
Polymorphism
+7%
![Page 30: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/30.jpg)
class User { Device[] devices = {}; }
What is wrong here?
![Page 31: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/31.jpg)
class User { Device[] devices = {}; }
Allocations
![Page 32: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/32.jpg)
{} is new Device[0]
Allocations
![Page 33: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/33.jpg)
class User { final static Device[] EMPTY = {}; Device[] devices = EMPTY; }
Solution
![Page 34: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/34.jpg)
preAllocatedArray thrpt 209423 ops/snewArrayAllocation thrpt 104293 ops/s
Allocations
+50%
![Page 35: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/35.jpg)
void make(String… params)
What is wrong here?
![Page 36: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/36.jpg)
void make(String… params)
Allocations
![Page 37: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/37.jpg)
String… is new String[] {params}
Allocations
![Page 38: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/38.jpg)
void make(String p1)void make(String p1, String p2)void make(String p1, String p2, Str p3)
Solution
![Page 39: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/39.jpg)
noVarArgs thrpt 7947138 ops/svarArgs thrpt 4265333 ops/s
Allocations
+2x
![Page 40: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/40.jpg)
If (email == null || email.equals(“”)) { ...}
What is wrong here?
![Page 41: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/41.jpg)
If (email == null || email.equals(“”)) { ...}
Solution
![Page 42: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/42.jpg)
If (email == null || email.isEmpty()) { ...}
Slow equals
![Page 43: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/43.jpg)
isEmpty thrpt 364123 ops/sequals thrpt 231075 ops/s
Slow equals
+60%
![Page 44: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/44.jpg)
val.equals(input.toLowerCase());
What is wrong here?
![Page 45: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/45.jpg)
val.equals(input.toLowerCase());
Allocations
![Page 46: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/46.jpg)
val.equalsIgnoreCase(input);
Solution
![Page 47: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/47.jpg)
ignoreCase thrpt 47550 ops/stoLowerCase thrpt 20339 ops/s
Allocations
+2.3x
![Page 48: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/48.jpg)
val.startsWith(input.toLowerCase());
One more case
![Page 49: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/49.jpg)
val.regionMatches(true, 0, input, 0, len);
Solution
![Page 50: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/50.jpg)
regionMatch thrpt 54924 ops/sstartWithToLowerCase thrpt 14447 ops/s
Allocations
+4x
![Page 51: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/51.jpg)
Use strict equals
Solution 2
![Page 52: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/52.jpg)
val.split(“\0”);
What is wrong here?
![Page 53: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/53.jpg)
val.split(“\0”);
Split is slow
![Page 54: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/54.jpg)
Utils.split(val, ‘\0’);
Solution
![Page 55: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/55.jpg)
String[] split2(char separator, String body) { final int i1 = body.indexOf(separator, 1); if (i1 == -1) { return new String[] {body}; }
return new String[] { body.substring(0, i1), body.substring(i1 + 1, body.length()) }; }
Solution
![Page 56: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/56.jpg)
customSplit avgt 46 ns/opsplit avgt 115 ns/op
Split is slow
+3x
![Page 57: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/57.jpg)
return body1.trim() + SEPARATOR + body2.trim();
What is wrong here?
![Page 58: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/58.jpg)
return new StringBuilder().append(body1.trim()).append(SEPARATOR).append(body2.trim()).toString();
What is wrong here?
![Page 59: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/59.jpg)
return new StringBuilder().append(body1.trim()).append(SEPARATOR).append(body2.trim()).toString();
Concat optimization
![Page 60: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/60.jpg)
String trimmed1 = body1.trim();String trimmed2 = body2.trim();return trimmed1 + SEPARATOR + trimmed2;
Solution 1
![Page 61: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/61.jpg)
String trimmed1 = body1.trim();String trimmed2 = body2.trim();return new StringBuilder().append(trimmed1).append(SEPARATOR).append(trimmed2).toString();
Solution 2
![Page 62: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/62.jpg)
optimizedConcat thrpt 44888 ops/snaiveConcat thrpt 12866 ops/s
Concat optimization
+4x
![Page 63: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/63.jpg)
StringBuilder sb = new StringBuilder();sb.append(body1)sb.append(SEPARATOR)sb.append(body2)return sb.toString();
What is wrong here?
![Page 64: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/64.jpg)
StringBuilder sb = new StringBuilder();sb.append(body1)sb.append(SEPARATOR)sb.append(body2)return sb.toString();
No chaining
![Page 65: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/65.jpg)
return new StringBuilder().append(body1).append(SEPARATOR).append(body2).toString();
Solution
![Page 66: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/66.jpg)
chained thrpt 46279 ops/snotChained thrpt 27746 ops/s
Chaining
+70%
![Page 67: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/67.jpg)
String data = …;data.getBytes(charset);
What is wrong here?
![Page 68: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/68.jpg)
String data = …;data.getBytes(charset);
Generic Encoding
![Page 69: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/69.jpg)
if (charset == UTF_8) { return decodeUTF8(data);} else if (charset == US_ASCII) { return decodeASCII(data);} else { return data.getBytes(charset);}
Solution
![Page 70: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/70.jpg)
customGetBytes avgt 155 ns/opjavaGetBytes avgt 233 ns/op
Generic Encoding
+30%
![Page 71: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/71.jpg)
if (data == null) { throw new NoDataException();}
What is wrong here?
![Page 72: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/72.jpg)
if (data == null) { throw new NoDataException();}
Exception is expensive
![Page 73: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/73.jpg)
Double.parseDouble thrpt 22968 ops/sDouble.parseErr thrpt 737 ops/s
Exception Cost
+30x
![Page 74: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/74.jpg)
public Throwable(String message) { fillInStackTrace(); detailMessage = message;}
Exception Cost
![Page 75: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/75.jpg)
Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)
Exception Cost
![Page 76: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/76.jpg)
class MyException extends Exception { MyException(String message) {
super(message, null, true, false); }}
Solution 1
![Page 77: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/77.jpg)
final static MyException cache = new MyException();
Solution 2
![Page 78: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/78.jpg)
if (data == null) { return; //or return code}
Solution 3
![Page 79: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/79.jpg)
try { double d = Double.parseDouble(s);} catch (NumberFormatException e) {}
What is wrong here?
![Page 80: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/80.jpg)
try { double d = Double.parseDouble(s);} catch (NumberFormatException e) {}
Allocations
![Page 81: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/81.jpg)
● Does trim()● Spams ASCIIToBinaryConverter● Spams exceptions● Slow
Allocations
![Page 82: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/82.jpg)
try { double d = Utils.parseDouble(s);} catch (NumberFormatException e) {}
Solution
![Page 83: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/83.jpg)
parseDouble thrpt 22889 ops/sparseDoubleUtils thrpt 48331 ops/s
Custom parseDouble
+2.2x
![Page 84: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/84.jpg)
double d = 11.2321D;return Math.round(val);
What is wrong here?
![Page 85: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/85.jpg)
double d = 11.2321D;return Math.round(val);
Slow round
![Page 86: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/86.jpg)
double d = 11.2321D;return (int) (val + 0.5);
Solution
![Page 87: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/87.jpg)
Slow round
optimizedRound thrpt 383251 ops/smathRound thrpt 258123 ops/s
+50%
![Page 88: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/88.jpg)
public static int bitCount(int i) { i = i - ((i >>> 1) & 0x55555555); i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); i = (i + (i >>> 4)) & 0x0f0f0f0f; i = i + (i >>> 8); i = i + (i >>> 16); return i & 0x3f; }
What is wrong here?
![Page 89: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/89.jpg)
![Page 90: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/90.jpg)
Integer.bitCount(val);
Solution
![Page 91: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/91.jpg)
javaBitCount thrpt 413996 ops/smanualBitCount thrpt 232490 ops/s
Intrinsics
+80%
![Page 92: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/92.jpg)
http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/share/vm/classfile/vmSymbols.hpp
Intrinsics
![Page 93: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/93.jpg)
int[] ar = new int[] {1, -32, 1, 1, 5, 6, 7};return IntStream.of(ar).anyMatch(i -> i == val)
What is wrong here?
![Page 94: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/94.jpg)
int[] ar = new int[] {1, -32, 1, 1, 5, 6, 7};return IntStream.of(ar).anyMatch(i -> i == val)
Lambda/Stream cost
![Page 95: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/95.jpg)
naive thrpt 228002 ops/slambda thrpt 22983 ops/s
Lambda/Stream cost
~10x
![Page 96: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/96.jpg)
boolean contains(int[] ar, int value) { for (int arVal : ar) { if (arVal == value) { return true; } } return false; }
Solution
![Page 97: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/97.jpg)
E get(int index) { if (index >= size) { throw new IndexOutOfBoundsException(); } return (E) elementData[index];}
What is wrong here?
![Page 98: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/98.jpg)
E get(int index) { if (index >= size) { throw new IndexOutOfBoundsException(); } return (E) elementData[index];}
Bounds-checking
![Page 99: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/99.jpg)
noCheck thrpt 388332 ops/sboundCheck thrpt 341232 ops/s
Bounds-checking
+12%
![Page 100: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/100.jpg)
E get(int index) { return (E) elementData[index];}
Solution
![Page 101: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/101.jpg)
● Know your data (jmap, logs, db)● Know your flows (metrics, jstack)● Don’t rely on JIT● Don’t trust java :)● Always stress test your code● 1% vs 99%
Summary
![Page 102: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/102.jpg)
https://github.com/blynkkk/blynk-server
![Page 103: Java micro optimizations 2017](https://reader034.fdocuments.in/reader034/viewer/2022042611/5aaba8077f8b9ac7658b4679/html5/thumbnails/103.jpg)
https://github.com/doom369/java-microbenchmarks