SlideShare une entreprise Scribd logo
1  sur  103
Télécharger pour lire hors ligne
Micro optimizations
Dmitriy Dumanskiy
Blynk, CTO
Java blog : https://habrahabr.ru/users/doom369/topics
DOU : https://dou.ua/users/DOOM/articles/
Makers problem
+ = ?
Blynk
10000 req/sec
3 VM * 2 cores, 60$
25% load
10k of local installations
Typical Env.
Worst case 256 RAM (~40Mb for heap)
700 MHz, 1 core, ARM
● Typical code
● Plain java
● System is under “highload”
● All “issues” are from open-source
Today talk
Problems everybody
knows about
● Primitive wrappers
Typical issues
● Primitive wrappers
● Boxing / Unboxing
Typical issues
● Primitive wrappers
● Boxing / Unboxing
● Regex / Pattern matching
Typical issues
● Primitive wrappers
● Boxing / Unboxing
● Regex / Pattern matching
● String concatenation in loops
Typical issues
● Primitive wrappers
● Boxing / Unboxing
● Regex / Pattern matching
● String concatenation in loops
● Reflection
Typical issues
class User {
Date createdAt;
}
What is wrong here?
class User {
Date createdAt;
}
Memory consumption
class Date {
private transient long fastTime;
private BaseCalendar.Date cdate;
}
More memory
class User {
long createdAt;
}
Solution
for (String name : list) {
//do something
}
What is wrong here?
for (String name : list) {
//do something
}
Iterator allocation
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
String name = iter.next();
}
Iterator allocation
Scalar replacement.
Could be.
Or could be not.
Iterator allocation
for (int i = 0; i < list.size(); i++) {
Data data = list.get(i);
}
Solution 1
for (String s : array) {
//do something
}
Solution 2
iterateArray thrpt 168298 ops/s
iterateListWGet thrpt 132292 ops/s
iterateList thrpt 110188 ops/s
Iterator
+50%
List<Device> devices = ...;
return devices.get(0);
What is wrong here?
List<Device> devices = ...;
return devices.get(0);
Polymorphism
invokeInterface
Polymorphism
ArrayList<Device> devices = ...;
return devices.get(0);
Solution
arrayListGet thrpt 268418 ops/s
listGet thrpt 249005 ops/s
Polymorphism
+7%
class User {
Device[] devices = {};
}
What is wrong here?
class User {
Device[] devices = {};
}
Allocations
{} is new Device[0]
Allocations
class User {
final static Device[] EMPTY = {};
Device[] devices = EMPTY;
}
Solution
preAllocatedArray thrpt 209423 ops/s
newArrayAllocation thrpt 104293 ops/s
Allocations
+50%
void make(String… params)
What is wrong here?
void make(String… params)
Allocations
String… is new String[] {params}
Allocations
void make(String p1)
void make(String p1, String p2)
void make(String p1, String p2, Str p3)
Solution
noVarArgs thrpt 7947138 ops/s
varArgs thrpt 4265333 ops/s
Allocations
+2x
If (email == null || email.equals(“”)) {
...
}
What is wrong here?
If (email == null || email.equals(“”)) {
...
}
Solution
If (email == null || email.isEmpty()) {
...
}
Slow equals
isEmpty thrpt 364123 ops/s
equals thrpt 231075 ops/s
Slow equals
+60%
val.equals(input.toLowerCase());
What is wrong here?
val.equals(input.toLowerCase());
Allocations
val.equalsIgnoreCase(input);
Solution
ignoreCase thrpt 47550 ops/s
toLowerCase thrpt 20339 ops/s
Allocations
+2.3x
val.startsWith(input.toLowerCase());
One more case
val.regionMatches(true, 0, input, 0, len);
Solution
regionMatch thrpt 54924 ops/s
startWithToLowerCase thrpt 14447 ops/s
Allocations
+4x
Use strict equals
Solution 2
val.split(“0”);
What is wrong here?
val.split(“0”);
Split is slow
Utils.split(val, ‘0’);
Solution
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
customSplit avgt 46 ns/op
split avgt 115 ns/op
Split is slow
+3x
return body1.trim() + SEPARATOR +
body2.trim();
What is wrong here?
return new StringBuilder()
.append(body1.trim())
.append(SEPARATOR)
.append(body2.trim())
.toString();
What is wrong here?
return new StringBuilder()
.append(body1.trim())
.append(SEPARATOR)
.append(body2.trim())
.toString();
Concat optimization
String trimmed1 = body1.trim();
String trimmed2 = body2.trim();
return trimmed1 + SEPARATOR +
trimmed2;
Solution 1
String trimmed1 = body1.trim();
String trimmed2 = body2.trim();
return new StringBuilder()
.append(trimmed1)
.append(SEPARATOR)
.append(trimmed2)
.toString();
Solution 2
optimizedConcat thrpt 44888 ops/s
naiveConcat thrpt 12866 ops/s
Concat optimization
+4x
StringBuilder sb = new StringBuilder();
sb.append(body1)
sb.append(SEPARATOR)
sb.append(body2)
return sb.toString();
What is wrong here?
StringBuilder sb = new StringBuilder();
sb.append(body1)
sb.append(SEPARATOR)
sb.append(body2)
return sb.toString();
No chaining
return new StringBuilder()
.append(body1)
.append(SEPARATOR)
.append(body2)
.toString();
Solution
chained thrpt 46279 ops/s
notChained thrpt 27746 ops/s
Chaining
+70%
String data = …;
data.getBytes(charset);
What is wrong here?
String data = …;
data.getBytes(charset);
Generic Encoding
if (charset == UTF_8) {
return decodeUTF8(data);
} else if (charset == US_ASCII) {
return decodeASCII(data);
} else {
return data.getBytes(charset);
}
Solution
customGetBytes avgt 155 ns/op
javaGetBytes avgt 233 ns/op
Generic Encoding
+30%
if (data == null) {
throw new NoDataException();
}
What is wrong here?
if (data == null) {
throw new NoDataException();
}
Exception is expensive
Double.parseDouble thrpt 22968 ops/s
Double.parseErr thrpt 737 ops/s
Exception Cost
+30x
public Throwable(String message) {
fillInStackTrace();
detailMessage = message;
}
Exception Cost
Throwable(String message,
Throwable cause,
boolean enableSuppression,
boolean writableStackTrace)
Exception Cost
class MyException extends Exception {
MyException(String message) {
super(message, null, true, false);
}
}
Solution 1
final static
MyException cache = new MyException();
Solution 2
if (data == null) {
return; //or return code
}
Solution 3
try {
double d = Double.parseDouble(s);
} catch (NumberFormatException e) {
}
What is wrong here?
try {
double d = Double.parseDouble(s);
} catch (NumberFormatException e) {
}
Allocations
● Does trim()
● Spams ASCIIToBinaryConverter
● Spams exceptions
● Slow
Allocations
try {
double d = Utils.parseDouble(s);
} catch (NumberFormatException e) {
}
Solution
parseDouble thrpt 22889 ops/s
parseDoubleUtils thrpt 48331 ops/s
Custom parseDouble
+2.2x
double d = 11.2321D;
return Math.round(val);
What is wrong here?
double d = 11.2321D;
return Math.round(val);
Slow round
double d = 11.2321D;
return (int) (val + 0.5);
Solution
Slow round
optimizedRound thrpt 383251 ops/s
mathRound thrpt 258123 ops/s
+50%
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?
Integer.bitCount(val);
Solution
javaBitCount thrpt 413996 ops/s
manualBitCount thrpt 232490 ops/s
Intrinsics
+80%
http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee275
09/src/share/vm/classfile/vmSymbols.hpp
Intrinsics
int[] ar = new int[] {1, -32, 1, 1, 5, 6, 7};
return IntStream.of(ar).anyMatch(i -> i == val)
What is wrong here?
int[] ar = new int[] {1, -32, 1, 1, 5, 6, 7};
return IntStream.of(ar).anyMatch(i -> i == val)
Lambda/Stream cost
naive thrpt 228002 ops/s
lambda thrpt 22983 ops/s
Lambda/Stream cost
~10x
boolean contains(int[] ar, int value) {
for (int arVal : ar) {
if (arVal == value) {
return true;
}
}
return false;
}
Solution
E get(int index) {
if (index >= size) {
throw new IndexOutOfBoundsException();
}
return (E) elementData[index];
}
What is wrong here?
E get(int index) {
if (index >= size) {
throw new IndexOutOfBoundsException();
}
return (E) elementData[index];
}
Bounds-checking
noCheck thrpt 388332 ops/s
boundCheck thrpt 341232 ops/s
Bounds-checking
+12%
E get(int index) {
return (E) elementData[index];
}
Solution
● 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
https://github.com/blynkkk/blynk-server
https://github.com/doom369/java-microbenchmarks

Contenu connexe

Tendances

Clojure for Java developers - Stockholm
Clojure for Java developers - StockholmClojure for Java developers - Stockholm
Clojure for Java developers - Stockholm
Jan Kronquist
 
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
julien.ponge
 
TclOO: Past Present Future
TclOO: Past Present FutureTclOO: Past Present Future
TclOO: Past Present Future
Donal Fellows
 
Use of Apache Commons and Utilities
Use of Apache Commons and UtilitiesUse of Apache Commons and Utilities
Use of Apache Commons and Utilities
Pramod Kumar
 

Tendances (20)

SQL Server Select Topics
SQL Server Select TopicsSQL Server Select Topics
SQL Server Select Topics
 
Clojure for Java developers - Stockholm
Clojure for Java developers - StockholmClojure for Java developers - Stockholm
Clojure for Java developers - Stockholm
 
Pj01 4-operators and control flow
Pj01 4-operators and control flowPj01 4-operators and control flow
Pj01 4-operators and control flow
 
Joker 2015 - Валеев Тагир - Что же мы измеряем?
Joker 2015 - Валеев Тагир - Что же мы измеряем?Joker 2015 - Валеев Тагир - Что же мы измеряем?
Joker 2015 - Валеев Тагир - Что же мы измеряем?
 
Java_practical_handbook
Java_practical_handbookJava_practical_handbook
Java_practical_handbook
 
Kotlin decompiled
Kotlin decompiledKotlin decompiled
Kotlin decompiled
 
TDD Hands-on
TDD Hands-onTDD Hands-on
TDD Hands-on
 
From Java to Parellel Clojure - Clojure South 2019
From Java to Parellel Clojure - Clojure South 2019From Java to Parellel Clojure - Clojure South 2019
From Java to Parellel Clojure - Clojure South 2019
 
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
 
Java programs
Java programsJava programs
Java programs
 
Java 7 LavaJUG
Java 7 LavaJUGJava 7 LavaJUG
Java 7 LavaJUG
 
Advanced Python, Part 1
Advanced Python, Part 1Advanced Python, Part 1
Advanced Python, Part 1
 
Test string and array
Test string and arrayTest string and array
Test string and array
 
Apache Commons - Don\'t re-invent the wheel
Apache Commons - Don\'t re-invent the wheelApache Commons - Don\'t re-invent the wheel
Apache Commons - Don\'t re-invent the wheel
 
TclOO: Past Present Future
TclOO: Past Present FutureTclOO: Past Present Future
TclOO: Past Present Future
 
Clojure: The Art of Abstraction
Clojure: The Art of AbstractionClojure: The Art of Abstraction
Clojure: The Art of Abstraction
 
Node.js System: The Landing
Node.js System: The LandingNode.js System: The Landing
Node.js System: The Landing
 
Stop that!
Stop that!Stop that!
Stop that!
 
Use of Apache Commons and Utilities
Use of Apache Commons and UtilitiesUse of Apache Commons and Utilities
Use of Apache Commons and Utilities
 
Riyaj: why optimizer_hates_my_sql_2010
Riyaj: why optimizer_hates_my_sql_2010Riyaj: why optimizer_hates_my_sql_2010
Riyaj: why optimizer_hates_my_sql_2010
 

Similaire à Java micro optimizations 2017

Internship - Final Presentation (26-08-2015)
Internship - Final Presentation (26-08-2015)Internship - Final Presentation (26-08-2015)
Internship - Final Presentation (26-08-2015)
Sean Krail
 
Concurrency on the JVM
Concurrency on the JVMConcurrency on the JVM
Concurrency on the JVM
Vaclav Pech
 
Hacking parse.y (RubyKansai38)
Hacking parse.y (RubyKansai38)Hacking parse.y (RubyKansai38)
Hacking parse.y (RubyKansai38)
ujihisa
 
Hacking Parse.y with ujihisa
Hacking Parse.y with ujihisaHacking Parse.y with ujihisa
Hacking Parse.y with ujihisa
ujihisa
 
(Slides) Efficient Evaluation Methods of Elementary Functions Suitable for SI...
(Slides) Efficient Evaluation Methods of Elementary Functions Suitable for SI...(Slides) Efficient Evaluation Methods of Elementary Functions Suitable for SI...
(Slides) Efficient Evaluation Methods of Elementary Functions Suitable for SI...
Naoki Shibata
 

Similaire à Java micro optimizations 2017 (20)

Introduction to PyTorch
Introduction to PyTorchIntroduction to PyTorch
Introduction to PyTorch
 
Internship - Final Presentation (26-08-2015)
Internship - Final Presentation (26-08-2015)Internship - Final Presentation (26-08-2015)
Internship - Final Presentation (26-08-2015)
 
Address/Thread/Memory Sanitizer
Address/Thread/Memory SanitizerAddress/Thread/Memory Sanitizer
Address/Thread/Memory Sanitizer
 
The what over the how (another way on android development with kotlin)
The what over the how (another way on android development with kotlin)The what over the how (another way on android development with kotlin)
The what over the how (another way on android development with kotlin)
 
Scala + WattzOn, sitting in a tree....
Scala + WattzOn, sitting in a tree....Scala + WattzOn, sitting in a tree....
Scala + WattzOn, sitting in a tree....
 
Introduction To Lisp
Introduction To LispIntroduction To Lisp
Introduction To Lisp
 
Idea for ineractive programming language
Idea for ineractive programming languageIdea for ineractive programming language
Idea for ineractive programming language
 
Kamil witecki asynchronous, yet readable, code
Kamil witecki asynchronous, yet readable, codeKamil witecki asynchronous, yet readable, code
Kamil witecki asynchronous, yet readable, code
 
Concurrency on the JVM
Concurrency on the JVMConcurrency on the JVM
Concurrency on the JVM
 
Dynomite at Erlang Factory
Dynomite at Erlang FactoryDynomite at Erlang Factory
Dynomite at Erlang Factory
 
04 Multi-layer Feedforward Networks
04 Multi-layer Feedforward Networks04 Multi-layer Feedforward Networks
04 Multi-layer Feedforward Networks
 
Hacking parse.y (RubyKansai38)
Hacking parse.y (RubyKansai38)Hacking parse.y (RubyKansai38)
Hacking parse.y (RubyKansai38)
 
Groovy
GroovyGroovy
Groovy
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
 
ch04-conditional-execution.ppt
ch04-conditional-execution.pptch04-conditional-execution.ppt
ch04-conditional-execution.ppt
 
Hacking Parse.y with ujihisa
Hacking Parse.y with ujihisaHacking Parse.y with ujihisa
Hacking Parse.y with ujihisa
 
SOLID Java Code
SOLID Java CodeSOLID Java Code
SOLID Java Code
 
Electrical Engineering Assignment Help
Electrical Engineering Assignment HelpElectrical Engineering Assignment Help
Electrical Engineering Assignment Help
 
(Slides) Efficient Evaluation Methods of Elementary Functions Suitable for SI...
(Slides) Efficient Evaluation Methods of Elementary Functions Suitable for SI...(Slides) Efficient Evaluation Methods of Elementary Functions Suitable for SI...
(Slides) Efficient Evaluation Methods of Elementary Functions Suitable for SI...
 
The TclQuadcode Compiler
The TclQuadcode CompilerThe TclQuadcode Compiler
The TclQuadcode Compiler
 

Plus de Dmitriy Dumanskiy (6)

Reactive server with netty
Reactive server with nettyReactive server with netty
Reactive server with netty
 
JEEConf. Vanilla java
JEEConf. Vanilla javaJEEConf. Vanilla java
JEEConf. Vanilla java
 
Handling 20 billion requests a month
Handling 20 billion requests a monthHandling 20 billion requests a month
Handling 20 billion requests a month
 
Tweaking performance on high-load projects
Tweaking performance on high-load projectsTweaking performance on high-load projects
Tweaking performance on high-load projects
 
JVM performance options. How it works
JVM performance options. How it worksJVM performance options. How it works
JVM performance options. How it works
 
Куда уходит память?
Куда уходит память?Куда уходит память?
Куда уходит память?
 

Dernier

Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power Play
Epec Engineered Technologies
 
DeepFakes presentation : brief idea of DeepFakes
DeepFakes presentation : brief idea of DeepFakesDeepFakes presentation : brief idea of DeepFakes
DeepFakes presentation : brief idea of DeepFakes
MayuraD1
 
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills KuwaitKuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
jaanualu31
 
"Lesotho Leaps Forward: A Chronicle of Transformative Developments"
"Lesotho Leaps Forward: A Chronicle of Transformative Developments""Lesotho Leaps Forward: A Chronicle of Transformative Developments"
"Lesotho Leaps Forward: A Chronicle of Transformative Developments"
mphochane1998
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
Neometrix_Engineering_Pvt_Ltd
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ssuser89054b
 
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Kandungan 087776558899
 

Dernier (20)

FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced LoadsFEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
 
Thermal Engineering Unit - I & II . ppt
Thermal Engineering  Unit - I & II . pptThermal Engineering  Unit - I & II . ppt
Thermal Engineering Unit - I & II . ppt
 
Computer Lecture 01.pptxIntroduction to Computers
Computer Lecture 01.pptxIntroduction to ComputersComputer Lecture 01.pptxIntroduction to Computers
Computer Lecture 01.pptxIntroduction to Computers
 
Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power Play
 
DeepFakes presentation : brief idea of DeepFakes
DeepFakes presentation : brief idea of DeepFakesDeepFakes presentation : brief idea of DeepFakes
DeepFakes presentation : brief idea of DeepFakes
 
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills KuwaitKuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
Kuwait City MTP kit ((+919101817206)) Buy Abortion Pills Kuwait
 
"Lesotho Leaps Forward: A Chronicle of Transformative Developments"
"Lesotho Leaps Forward: A Chronicle of Transformative Developments""Lesotho Leaps Forward: A Chronicle of Transformative Developments"
"Lesotho Leaps Forward: A Chronicle of Transformative Developments"
 
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best ServiceTamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
 
Generative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPTGenerative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPT
 
Integrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - NeometrixIntegrated Test Rig For HTFE-25 - Neometrix
Integrated Test Rig For HTFE-25 - Neometrix
 
Unleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leapUnleashing the Power of the SORA AI lastest leap
Unleashing the Power of the SORA AI lastest leap
 
PE 459 LECTURE 2- natural gas basic concepts and properties
PE 459 LECTURE 2- natural gas basic concepts and propertiesPE 459 LECTURE 2- natural gas basic concepts and properties
PE 459 LECTURE 2- natural gas basic concepts and properties
 
Orlando’s Arnold Palmer Hospital Layout Strategy-1.pptx
Orlando’s Arnold Palmer Hospital Layout Strategy-1.pptxOrlando’s Arnold Palmer Hospital Layout Strategy-1.pptx
Orlando’s Arnold Palmer Hospital Layout Strategy-1.pptx
 
Unit 4_Part 1 CSE2001 Exception Handling and Function Template and Class Temp...
Unit 4_Part 1 CSE2001 Exception Handling and Function Template and Class Temp...Unit 4_Part 1 CSE2001 Exception Handling and Function Template and Class Temp...
Unit 4_Part 1 CSE2001 Exception Handling and Function Template and Class Temp...
 
Design For Accessibility: Getting it right from the start
Design For Accessibility: Getting it right from the startDesign For Accessibility: Getting it right from the start
Design For Accessibility: Getting it right from the start
 
Block diagram reduction techniques in control systems.ppt
Block diagram reduction techniques in control systems.pptBlock diagram reduction techniques in control systems.ppt
Block diagram reduction techniques in control systems.ppt
 
Thermal Engineering -unit - III & IV.ppt
Thermal Engineering -unit - III & IV.pptThermal Engineering -unit - III & IV.ppt
Thermal Engineering -unit - III & IV.ppt
 
School management system project Report.pdf
School management system project Report.pdfSchool management system project Report.pdf
School management system project Report.pdf
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
 

Java micro optimizations 2017