performance #5 cpu and battery
TRANSCRIPT
![Page 1: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/1.jpg)
Idan Felix10/08/2016
http://bit.ly/2aMrRzgWifi password : dotheimpossible
CPU & BatteryMost eclectic we had so far
5
![Page 2: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/2.jpg)
First,
![Page 3: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/3.jpg)
Idan Felix
I’m 33 years old
VaronisAndroid Academy TLV
![Page 4: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/4.jpg)
Idan Felix
I’m 33 years old
VaronisAndroid Academy TLV
![Page 5: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/5.jpg)
Yonatan LevinGoogle Developer
Expert & Android @ Gett
Idan FelixSenior Android &
Redhead Varonis
Jonathan Yarkoni
Android Developer & Advocate Ironsource
Android Academy Staff
Britt Barak
Android LeadReal
Muiriel Felix
Android Design
![Page 6: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/6.jpg)
I am selling out
![Page 7: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/7.jpg)
Logistics
Logistics
![Page 8: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/8.jpg)
Yossi SegevAndroid
@Crave
![Page 9: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/9.jpg)
https://www.facebook.com/groups/android.academy.ils/
![Page 10: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/10.jpg)
What’s next?14/9 - Britt- Threading
![Page 11: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/11.jpg)
![Page 12: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/12.jpg)
30 / 10 / 2016New course coming
30 / 10 / 2016New course coming
![Page 13: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/13.jpg)
30 / 10 / 2016New course coming
30 / 10 / 2016New course coming
● +: Networking Debt.● A: CPU
○ Theory○ Practice
● B: Battery○ Theory○ Practice
10/08/2016
CPU & Battery
![Page 14: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/14.jpg)
- Assess the problem and establish acceptable behavior.
- Measure perf b4 modification.
- Identify bottleneck.- Remove bottleneck.- Measure perf after
modification.- If better, adopt.
If worse, put it back.
Methods of Systematic performance improvement
https://en.wikipedia.org/wiki/Performance_tuning
![Page 15: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/15.jpg)
Bonus Part: Networking
+“A man in debt is so far a slave.”Ralph Waldo Emerson
![Page 16: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/16.jpg)
Last month, Yonatan talked about
- Networks basics- Retrofit 2.0- Caching, Prefetching- Bundling-up with Android (~ Sync Adapters),
Or at least playing nice (~ Job Scheduler)- Doze (Will be revised
today)Really, check it out. https://docs.google.com/presentation/d/1maecLjfOOy38_VJWc2YKzoXGSR2ulF3KLG6wmoJ3OwE/edit?usp=sharing
![Page 17: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/17.jpg)
Serialization
How objects move across domains*
![Page 18: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/18.jpg)
Serialization/Deserialization
Serialization
Deserialization
![Page 19: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/19.jpg)
JSON Class Representation
{ "starwars": { "number_of_episodes": 1, "realDarthVaderName": "Anakin Skywalker", "nextEpisodeRelease": "01-12-2016 01:00:00+3:00GMT" }}
![Page 20: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/20.jpg)
Sounds like a good idea, right?
![Page 21: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/21.jpg)
Serialization/Deserialization
Advantage - It’s human readable. And it’s its weakest point too.
GZipabilityMemory overhead
![Page 22: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/22.jpg)
GZip
When communicating with servers, it makes sense to compress the data, and it’s quite easy to do so. GZip is a GNU-Licensed compression algorithm, which is a merge of 2 compression algorithms: Lampel-Ziv-77 and Huffman-Codes,That works in 32kb chunks.
![Page 23: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/23.jpg)
GZip - LZ77 Concept - Back References
למעלה מלמטה המתגלגל גלגל קול
ומתגלגלות הולכות סתומות מרכבות
Credit for the example: Orevi Joe
2,28,4
7,27,210,2 49,4 41,2
5,2
![Page 24: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/24.jpg)
How to mess up compressibility
When you’re sending arrays or lists of large objects, the JSON format OOB has a lot of redundancy, and if the object is large, then some of the references fail.
![Page 25: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/25.jpg)
How to mess up compressibility - Solution
Consider crafting a DTO that would be optimized for smaller footprint and compression.Have numbers and similar strings close to each other.Consider refactoring a list-of-object to an object-of-lists.
![Page 26: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/26.jpg)
JSON Class Representation[ { "id": 314, "shoe_size": 42, "show_image": "-- 32kB Base64 representation of a PNG --", }, { "id": 42, "shoe_size": 42, "show_image": "-- 32kB Base64 representation of another PNG --", }, { "id": 456, "shoe_size": 42, "show_image": "-- 32kB Base64 representation of a different PNG --", },}
![Page 27: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/27.jpg)
JSON Class Representation{ "id": [314,42,456], "shoe_sizes": [42,42,42], "show_images": [ "-- 32kB Base64 representation of a PNG --", "-- 32kB Base64 representation of another PNG --", "-- 32kB Base64 representation of a different PNG --" ]}
![Page 28: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/28.jpg)
Json vs. Optimized-JSonHumanReadability
Performance
JSonOptimiz
edJSon
Flat Buffers
![Page 29: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/29.jpg)
- Faster- Lighter
FlatBuffers
Colt McAnlis: https://youtu.be/IwxIIUypnTE
![Page 30: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/30.jpg)
How it works?
![Page 31: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/31.jpg)
Process
1.Create schema2.Compile schema with flatc compiler3.Import generated files into your project4.Read from byte[]:
java.nio.ByteBuffer buf = builder.dataBuffer();// Deserialize the data from the buffer.StarWars starWars = StarWars.getRootAsStarWars(buf);
![Page 32: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/32.jpg)
Any Questions?
![Page 33: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/33.jpg)
Any Questions?
● +: Networking Debt.● A: CPU
○ Theory○ Practice
● B: Battery○ Theory○ Practice
10/08/2016
CPU & Battery
![Page 34: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/34.jpg)
Part A: CPUA
“Tears come from the heart and not from the brain. ”
Leonardo Di Vinci
![Page 35: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/35.jpg)
Understanding CPU- How does my phone know Java?- Big-O Notation and an intro to Data Structures- Auto-Boxing- Optimized Data Structures (Sparse Arrays and
Maps)- Things we can’t control
![Page 36: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/36.jpg)
But before we begin, something totally unrelated..
What is
Eyjafjörður?
![Page 37: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/37.jpg)
I wonder…How does my phone know
Java?
Well, IT DOESN’T
![Page 38: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/38.jpg)
Build → ExecuteOn your PC, Gradle does a really complicatedBuild process, that takes the Java Code andTurns it into an APK.We’ll go into what it does, So we can appreciate the beauty.
![Page 39: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/39.jpg)
Build → ExecuteSimplified Walkthrough the build:A. Manifest Merging
B. AAPT goes over the RES file and produces R.java and resources
C. Javac takes the code and produces a JAR file
D. ProGuard optimizes the JAR(s)
E.Dx takes the JAR(s) and produces a DEX file
F. AAPT takes everything (+ the Manifest), signs it and packs it to an APK
G. JarSigner signs the APK
Read more: https://developer.android.com/studio/build/index.html
![Page 40: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/40.jpg)
The APK is unzipped on the device. The customized Java Runtime loads and executes your code.
Build → Execute
If KitKat (4.4) and below
DALVIKIf Lollipop and above
ART
![Page 41: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/41.jpg)
Remember this classic diagram?
Build → Execute
We are here.
![Page 42: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/42.jpg)
Build → Execute: Dalvik
Dalvik is a VM that..:- uses dex (and odex) files to run programs.
Thanks, DEX, for using a short to index the method table. #65K
- Instead of being Stack based (Like the JVM), it is Register based.
- It’s main idea:
Being optimized for low memory consumption.
![Page 43: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/43.jpg)
Build → Execute: Dalvik
And then there was Froyo (2.2)Google added an amazing ability, called JIT compiling (by trace).
JIT - Compile parts (~by trace) of the “ByteCode” to Machine-Code.Performance was better - but the optimization options were limited.
![Page 44: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/44.jpg)
Runtime-Perf: What to measure?
These are some of the KPIs for the Runtime:- Performance - App Startup Time- Jank- Battery Footprint- Memory Footprint
![Page 45: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/45.jpg)
Build → Execute: Art
The Art (~Android Runtime) uses the same dx format,
But instead of JIT-Compiling, uses AOT-Compiling.
When installing an app, the phone compiles the entire dex to machine-code, and binds (statically link) whatever it needs to the framework.
![Page 46: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/46.jpg)
![Page 47: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/47.jpg)
![Page 48: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/48.jpg)
Build → Execute: Art
In N, ART does both JIT and AOT.It profiles your code, and decides which methods it should compile.Since compilation is not a trivial task, it does it only when the device is 100% charged and connected to the charger.Read: In Nougat, connecting your phone to a charger makes it work faster.
![Page 49: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/49.jpg)
So, Is your phone a computer or not?
Why Yes:It has a CPU, Memory, GPU, an OS, It runs Java
Why No:Not the same VM, Not the same amounts of CPU, Memory, Not the same usage patterns and expectations.
![Page 50: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/50.jpg)
If it was a computer...
![Page 51: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/51.jpg)
Big-O and Data Structures
This is what we were taught in Intro2CS, DataStructures, and etc.:
- Considering very large inputs (limn->∞) and ignore constants
- The Big O Notation: “1.02n” >> “n3 + 5n2” === “30n3” > “1000n2”
- Counting operations- Accessing a memory cell by address is O(1)
Loops on some input are O(n),
- Trade-off Everything
![Page 52: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/52.jpg)
Big-O and Data Structures
![Page 53: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/53.jpg)
Big-O and Data Structures
Some rules still apply in mobile:- Use the right algorithm, - Use the right data-structure,- Be Smart
Don’t forget that this is a mobile device.
![Page 54: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/54.jpg)
Storing a list of numbers
You need to store n integers.If you know what n is, use an array.If you don’t - What do you do?(Support insert-last and get operation)
![Page 55: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/55.jpg)
Possible Solution:
Create an array-like interface:int get(int index)void insertLast(int value)
Guess or get an initial size, and if needed, Create a new array with more room, copy the items, and use the new array.
Discuss.
![Page 56: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/56.jpg)
Possible Solution, Now with Generics:
Create an array-like interface:T get(int index)void insert(T value, int index)
This is also called an ArrayList<T>.
Are there any implications? Discuss.
![Page 57: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/57.jpg)
How Generics Work
In Java, The compiler translates your <T>s to Objects, and adds casting as necessary.So, you can’t use int (or boolean, or double, or long, …), so instead, you use Integer (or Boolean, Double, or Long), which do the same thing, more or less.
![Page 58: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/58.jpg)
Now, consider these codes
int i = 5; Integer i = 5;int j = i + 2;Integer j = i + 2;
What do these compile to?
![Page 59: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/59.jpg)
Now, consider these codes
int i = 5; Integer i = 5;int j = i + 2;Integer j = i + 2;public void noBoxing(); Code: 0: iconst_5 1: istore_1 2: iload_1 3: iconst_2 4: iadd 5: istore_2 6: return
Proof: javap -c Boxing.java
public void withBoxing(); Code: 0: iconst_5 1: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 4: astore_1 5: aload_1 6: invokevirtual #3 // Method java/lang/Integer.intValue:()I 9: iconst_2 10: iadd 11: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 14: astore_2 15: return
![Page 60: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/60.jpg)
Now, consider this code
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);list.add(2);
Same issue.
![Page 61: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/61.jpg)
Now, consider this code
ArrayList<Integer> list = new ArrayList<Integer>();For (int i = 0; i++; i < list.size()){
int value = list.get(i);} Same
issue.
![Page 62: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/62.jpg)
AutoBoxing
To handle previous code samples, The runtime automagically takes your int, puts it inside a box, called Integer and stores it in the heap.
This is AutoBoxing.
Colt McAnlis: https://youtu.be/dgzOwuoXVJU
![Page 63: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/63.jpg)
AVOID BOXING
BEWARE of AUTO-BOXINGColt McAnlis: https://youtu.be/dgzOwuoXVJU
![Page 64: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/64.jpg)
Any Questions?
![Page 65: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/65.jpg)
Storing a list of objects, by Key
You need to store n objects, by key.If you know what n is, use an array.If you don’t - What do you do?(Support an insert and get operations)
![Page 66: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/66.jpg)
Storing a list of objects, by Key
Consider this API:void insert(key, value)int get(key)
![Page 67: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/67.jpg)
What’s in a key?
Consider this task:You have a list of devices that you want to retrieve by their IMEI.Here’s a sample IMEI: 53865487920334156 (17 digits)It doesn’t make sense to have an array with 1017 cells…
Same for Creditcards, ID numbers, GUIDs, and mostly anything that has an id and there’s a lot of it in the world, and you will not need them all
![Page 68: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/68.jpg)
Here’s what we’ll do- Squash the key to something we can handle
(~HashCode),Store according to the key
- Handle Conflicts somehow (Open-hash / Closed-hash)
- Handle resizing somehow
- If we add Generics, This will be called java.util.HashMap<TKey, TValue>
![Page 69: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/69.jpg)
Is it the right algorithm?
- Inserting: Amortized O(1), but up to O(n)- Searching: Amortized O(1), but up to O(n)
- Memory Consumption - Not so good.
![Page 70: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/70.jpg)
What’s wrong with it?
- If you’re using Integers or Longs (IMEIs), for keys or for values, you might hit AutoBoxing.
- The “Entry” class (internal implementation detail) is another layer of abstraction that gets allocated that we don’t need.
- Compacting and Expending are expensive
![Page 71: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/71.jpg)
HashMap solution 1: ArrayMaps
ArrayMaps (from android.util) use a different algorithm:It uses 2 arrays - one for the values and the keys, and one for the hashes, which is kept sorted.
Colt McAnlis: https://youtu.be/ORgucLTtTDI
![Page 72: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/72.jpg)
HashMap solution 1: ArrayMaps
ArrayMaps (from android.util) use a different algorithm:It uses 2 arrays - one for the values and the keys, and one for the hashes, which is kept sorted.Insertion - O(n)Searching - O(log n)
Colt McAnlis: https://youtu.be/ORgucLTtTDI
![Page 73: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/73.jpg)
HashMap solution 1: ArrayMaps
ArrayMaps (from android.util) use a different algorithm:It uses 2 arrays - one for the values and the keys, and one for the hashes, which is kept sorted.Insertion - O(n)Searching - O(log n)
Memory consumption - much better, but autoboxing is still an issueColt McAnlis: https://youtu.be/ORgucLTtTDI
![Page 74: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/74.jpg)
HashMap Solution #1: ArrayMaps
This data-structure is useful on mobile for 2 use-cases:
![Page 75: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/75.jpg)
HashMap solution 2: SparseArrays and co.
Sparse Arrays are optimized for no-autoboxing, and use similar algorithms for storage as ArrayMaps.Use SparseArrays when the keys or the values are primitives (partial):
Colt McAnlis: https://youtu.be/I16lz26WyzQ
Key Type Value Type SparseArray
Integer Object SparseArray
Integer Boolean SparseBooleanArray
Long Object LongSparseArray
![Page 76: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/76.jpg)
Important for job interviews
SparseArrays and Array-Maps:GET - Requires binary search - O(log
n)INS - Require binary search and
moving - O(n)(and they also don’t retain order, נבלות)
![Page 77: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/77.jpg)
Another “what does this compiles to”
Consider the following code:// from Iterators.foo();ArrayList<Foo> foos = new ArrayList<Foo>();for (Foo foo : foos){ // … Do something with foo}
![Page 78: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/78.jpg)
public void foo(); Code: 0: new #2 // class java/util/ArrayList 3: dup 4: invokespecial #3 // Method java/util/ArrayList."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #4 // Method java/util/ArrayList.iterator:()Ljava/util/Iterator; 12: astore_2 13: aload_2 14: invokeinterface #5, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z 19: ifeq 35 22: aload_2 23: invokeinterface #6, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object; 28: checkcast #7 // class Foo 31: astore_3 32: goto 13 35: return
What does it compile to? (In Bytecode)
![Page 79: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/79.jpg)
Now, Let’s compare public void baz(){ ArrayList<Foo> foos = new ArrayList<Foo>(); int size = foos.size(); for (int i = 0; i < size; i++){ Foo foo = foos.get(i); // Do something with foo... } }
![Page 80: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/80.jpg)
Now, Let’s compare public void baz(); Code: 0: new #2 // class java/util/ArrayList 3: dup 4: invokespecial #3 // Method java/util/ArrayList."<init>":()V 7: astore_1 8: aload_1 9: invokevirtual #8 // Method java/util/ArrayList.size:()I 12: istore_2 13: iconst_0 14: istore_3 15: iload_3 16: iload_2 17: if_icmpge 36 20: aload_1 21: iload_3 22: invokevirtual #9 // Method java/util/ArrayList.get:(I)Ljava/lang/Object; 25: checkcast #7 // class Foo 28: astore 4 30: iinc 3, 1 33: goto 15 36: return
![Page 81: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/81.jpg)
Hmm. Android vs. Java?- Java: use for(int i : list) because that’s how
we do it in java.
- Android: do what Java says, especially if you’re using
an iterator. https://developer.android.com/training/articles/perf-tips.html#Loops
- Colt McAnlis:Use a CS101 for loop, avoid the iterator if
possible.See for yourself: https://youtu.be/MZOf3pOAM6A
![Page 82: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/82.jpg)
One thing we can’t control
Android can change the speed of the CPU to conserve battery.
Slower CPU ⇒ Battery lasts longer
This might cause 2 symptoms:- Dropped frames (it takes 20ms for the CPU to speed-up
again)- Normal things take longer
This is OK
Colt McAnlis: https://youtu.be/c8u3fEM3JG0
![Page 83: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/83.jpg)
Any Questions?
![Page 84: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/84.jpg)
Any Questions?
● +: Networking Debt.● A: CPU
○ Theory○ Practice
● B: Battery○ Theory○ Practice
10/08/2016
CPU & Battery
![Page 85: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/85.jpg)
A recent study showed that 100% of your users don’t use your app when their battery is
out of juice.
The BatteryB
![Page 86: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/86.jpg)
Understanding Battery- Battery theory
- As A Developer, How to reduce battery usage
- As ANDROID, How to reduce battery usage
![Page 87: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/87.jpg)
Measurement Units
Ampere (A) is a unit of electric current. It describes how much power something needs at an instant.Milli-Ampere (mA) is the unit that we actually use, because it’s a mobile device, and things don’t use a lot of power.Example: My GPS needs 140mA, and my 4G chip needs 180mA.https://en.wikipedia.org/wiki/Ampere
![Page 88: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/88.jpg)
Measurement Units
However, it doesn’t take time into considerations - That’s why we use mAh.
Example: Nexus 5X battery is 2,700 mAh
https://en.wikipedia.org/wiki/Ampere-hour
![Page 89: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/89.jpg)
Battery Theory
My GPS needs 140mA, and my 4G chip needs 180mA.
Which is better for getting a location:
using the GPS or the 4G chip?
![Page 90: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/90.jpg)
Battery Theory
My GPS needs 140mA, and my 4G chip needs 180mA.
Getting a GPS lock takes about 25 seconds, so:25s x 140mA ~= 1mAh
![Page 91: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/91.jpg)
Battery Theory
My GPS needs 140mA, and my 4G chip needs 180mA.
Getting network location lock takes about 2 seconds, so:2s x 180mA ~= 0.1mAhJeffrey Sharkey: https://youtu.be/OUemfrKe65c (From Google I/O 2009)
![Page 92: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/92.jpg)
So, What’s killing your battery?
The Scree
n
The Mode
mThe GPS
Foreground work Background work
![Page 93: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/93.jpg)
About the screen
![Page 94: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/94.jpg)
So what can you do?
Taste of what’s possible: https://developer.android.com/reference/android/app/job/JobInfo.Builder.html
Reduce
Keep background activity to minimum
DeferWait with the activity until the device is
charging
CoalesceTry to piggy-back, batch,
queue or group background work
with other background
tasks that has to be done
![Page 95: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/95.jpg)
The battery and the Radio
True or false:
3G and WIFI need (more or less)
the same amount of power~180 mAh
![Page 96: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/96.jpg)
The battery and the Radio
However, downloading 100mb via 3G radio takes 1’56’’ and via WIFI 0’10’’
180mAh x 10sec = 0.5 mAh180mAh x 116sec = 5.8 mAh
![Page 97: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/97.jpg)
The battery and the Radio
Also: - Radio wake-up costs a lot of power- Radio has to stay awake for responses (and responses of
responses)
- Radio goes to sleep after about ~20sec of activity.
Dive Deeper: Ran Nachmani @ Big Android BBQ 2015: https://youtu.be/LO_Swql0zVg
![Page 98: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/98.jpg)
The battery and the Radio
So what can you do?
I/O 2016: https://youtu.be/VC2Hlb22mZM
Guide: https://developer.android.com/training/efficient-downloads/efficient-network-access.html
Reduce Defer Coalesce
- If it’s not important - Don’t- Reduce payload (GZIP,
FlatBuffers)
- Use the JobScheduler to wait for
- Charger- WIFI
- Piggy-back with SyncAdapters
- Prefetch and Batch
Change usage pattern according to network state!
![Page 99: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/99.jpg)
Tool: DDMS / ADM
The Android Device Monitor can really help in understanding what the network is doing.
![Page 100: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/100.jpg)
Any Questions?
![Page 101: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/101.jpg)
GPS in action
Your device can find its locations using 3 devices:- The GPS, which uses few satellites for exact
location.- The 3G network that uses cell-tower triangulation.- Some WIFI networks can also hint of where you
are.Each of these is a location provider.
![Page 102: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/102.jpg)
Most use the Fused Location Provider from Google Play services.It merges all location providers for bests results and optimal footprint.protected void createLocationRequest() { LocationRequest mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(10000); mLocationRequest.setFastestInterval(5000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);}
GPS in action
https://developer.android.com/training/location/change-location-settings.html
![Page 103: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/103.jpg)
GPS in action
True or false:
You might be updated on location
More frequent than you ask.
![Page 104: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/104.jpg)
The battery and the GPS
We already talked about using the GPS vs the 3G data.What else can we do?
More: Colt McAnlis: https://youtu.be/81W61JA6YHw
Reduce Defer Coalesce
- Ask for less accurate location
- Ask for less updates- Limit number of callbacks
- Ask for less updates - Piggy-back other GPS requests
![Page 105: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/105.jpg)
Reduce the location battery footprint of your app.
Set the priority for the accuracy you need.PRIORITY_LOW_POWER (~10km "city" accuracy)PRIORITY_BALANCED_POWER_ACCURACY (~100m "block" accuracy)PRIORITY_HIGH_ACCURACY (accurate as possible at the expense of battery life)
The battery and the GPS
https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest
Reduce
- Ask for less accurate location
- Ask for less updates- Limit number of callbacks
![Page 106: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/106.jpg)
The battery and the GPS
Reduce the location battery footprint of your app.
Set the interval as high as you can. mLocationRequest.setInterval(10000);
https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest
DeferReduc
e- Ask for less accurate
location- Ask for less updates- Limit number of callbacks
![Page 107: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/107.jpg)
The battery and the GPS
Reduce the location battery footprint of your app.
Also limit the number of callbacks. mLocationRequest.setFastestInterval(5000);
https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest
Reduce
- Ask for less accurate location
- Ask for less updates- Limit number of callbacks
![Page 108: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/108.jpg)
The battery and the GPS
Reduce the location battery footprint of your app.
Use PRIORITY_NO_POWER to passively listen for location updates from other clients.
https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest
- Piggy-back other GPS requests
Coalesce
![Page 109: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/109.jpg)
Any Questions?
![Page 110: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/110.jpg)
So, What’s killing your battery?
The Scree
n
The Mode
mThe GPS
Foreground work Background work
![Page 111: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/111.jpg)
About the screen
THIS WAS A LIE
![Page 112: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/112.jpg)
Wasting screen / cpu energy
Sometimes, you want to keep the device awake to do some work.Perhaps you want the screen to stay on while watching a video, or wake-up from sleep to calculate something periodically.
This can be done with WakeLocks:PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");wakeLock.acquire();Training: https://developer.android.com/training/scheduling/wakelock.html Colt McAnlis: https://youtu.be/reMau7d0yeg
![Page 113: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/113.jpg)
Wasting screen / cpu energy
However, it’s really important to handle WakeLocks with care.
- Beware of dependencies (User data, server faults, etc.)
- Always use a timeout
Training: https://developer.android.com/training/scheduling/wakelock.html Colt McAnlis: https://youtu.be/reMau7d0yeg
![Page 114: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/114.jpg)
![Page 115: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/115.jpg)
Short story
Friday, ~8:00AMMy phone has ~22%
Mr. Levin: “Put it on the floor in your bag, don’t touch it,
and let it go into DOZE.”
![Page 116: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/116.jpg)
OK.
What does Android do to reserve battery?
![Page 117: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/117.jpg)
Doze
Introduced with Marshmallow (6.0, API 23),
https://developer.android.com/training/monitoring-device-state/doze-standby.html
![Page 118: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/118.jpg)
Doze
When the device is in this state:- Network access is suspended- The device ignores wake locks- Alarms (a la AlarmManager) don’t get execute (unless
While-Idle or setAlarmClock)
- No SyncAdapters or JobSchedulers
- System also does not do Wifi Scanshttps://developer.android.com/training/monitoring-device-state/doze-standby.html
![Page 119: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/119.jpg)
So we listened to you for 2 hours for nothing?
![Page 120: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/120.jpg)
Don’t be mad Don’t do anything
![Page 121: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/121.jpg)
If you have a problem with Doze, It means that you have a problem with a simple fact:
Your users have lifeThey might forget their tablet at home when they leave for a 3 days trip to Amsterdam, and would love for it to have battery when they come back from their trip. #TrueStory #FML
Doze
Joanna Smith, Big Android BBQ 2015: https://youtu.be/Rwshwq_vI1s
![Page 122: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/122.jpg)
Doze
Besides that,
Don’t do anything.If you’re using all the stuff we taught, you should be good- SyncAdapters, JobSchedulers will work as expected.
- Alarms are to be watched, and other network access too.Joanna Smith, Big Android BBQ 2015: https://youtu.be/Rwshwq_vI1s
![Page 123: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/123.jpg)
Doze
These are the states that the phone can be in:
Joanna Smith, Big Android BBQ 2015: https://youtu.be/Rwshwq_vI1s
Active Inactive Idle Pending Idle
Idle Maintenan
ceThis transition takes ~2h
Remember my story? About a 45m lecture?
![Page 124: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/124.jpg)
Doze
In Android Nougat, The terms for entering Doze were loosened.This means that even while the device is in the user’spocket it can go into Doze. Still same principle apply:
Don’t do anything about it.
![Page 125: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/125.jpg)
Any Questions?
![Page 126: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/126.jpg)
Felix stop!!! :)
![Page 127: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/127.jpg)
To Amsterdam...
You leave us...
![Page 129: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/129.jpg)
Missing from this lecture
![Page 131: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/131.jpg)
Any Questions?
![Page 132: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/132.jpg)
Idan Felix10/08/2016
CPU & BatteryMost eclectic we had so far
5
![Page 133: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/133.jpg)
Idan Felix10/08/2016
Everything is Trade-off
Be as smart as you can be. 5
![Page 134: Performance #5 cpu and battery](https://reader035.vdocuments.mx/reader035/viewer/2022062522/589cae801a28abbe4a8b562d/html5/thumbnails/134.jpg)
Idan Felix10/08/2016
Drive Home Safely.5