2. I’ve done all kind of micro-optimizations, use good
algorithms, choose the right data structures but still
got serious performance issues in my mobile apps.
Our online game took about 10
minutes to download 25 MB resources
using 3G in the old version
3. Performance issues?
The overall application runs slow.
The application makes other
applications on phone run slower (yes, it
can)
Users feel the application slow.
Be strict: it’s also performance issue if
we can do much better but we don’t
4. Some interesting points
Number of threads
Organizing threads
Multi-threading and network
Mobile network under the hood
10. Organizing threads
Blocking UI task
○ When there are no other data
on screen
○ When user definitely have to
wait for updated data only
Should be a single thread with
high priority since user can not
proceed if task is not done.
11. Organizing threads
Updater task
○ Updating / refreshing
○ Loading more
○ User can still interact with
existed data on screen
○ Can move to other screen
without finishing task
Should be a thread pool
(suggest size 2-4)
12. Organizing threads
Lazy media task
○ Thumbnails for existed data
○ A list/grid of images
Should be 2 thread pools: one
for downloading and one for
decoding
13. Organizing threads
Lazy media task (con.)
Usually most heavy task focus optimizing
Why separating into downloading and
decoding
○ Images might be in local cache already and
decoding usually much faster than
downloading, so don’t let downloading slow
down the progress
○ Decoding pool size should be based on CPU
cores
○ Downloading pool size should be based on
network status
14. Organizing threads
Decoding pool size
NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors();
mDecodeThreadPool = new ThreadPoolExecutor(NUMBER_OF_CORES,
NUMBER_OF_CORES, KEEP_ALIVE_TIME, KEEP_ALIVE_TIME_UNIT,
mDecodeWorkQueue);
15. Organizing threads
Downloading pool size
Normal:
○ Fixed size (may be 8 like in some tutorials)
More optimized:
○ 2G – size 4
○ 3G – size 8
○ 4G – size 16 (or more)
○ WIFI – size 8
Much more optimized:
○ Based on network speed, increasing size if
can still download faster, decreasing size if
still not slower, until get the best size.
16. Organizing threads
Why variable size is better choice:
2G pool size 2
2G pool size 4
2G pool size 8
17. Organizing threads
Why variable size is better choice:
3G pool size 4 3G pool size 8
3G pool size 24
18. Organizing threads
Facts:
Each connection has a limited bandwidth
The phone’s network connection has a
overall limited bandwidth
There are network latency causing “gaps”
while downloading
19. Organizing threads
Downloading pool size
Too small size
○ Waste network bandwidth
○ Drain battery life if using mobile network
○ Slow
Too large size
○ Take more time to show individual image (not
overall images on screen) users feel slow
○ TCP congestion control
○ Slower to start downloading new images when
scrolling
Variable size based on network status is good
choice but need more time to implement
20. Organizing threads
Conclusion:
Blocking UI task – 1 thread
Updater task – 1 thread pool size 2 - 4
Lazy media task – 2 thread pools
○ 1 thread pool for decoding size = available cores
○ 1 thread pool for downloading size based on
network status
21. Mobile network under the hood
Online applications like messenger,
news reader, social app or online
game… some got serious issues when
using mobile network
○ Battery drain
○ Slow response
26. Mobile network
Optimize data to transfer (as always)
Batch operation
Prefetch
When receive, if need to transmit then
do quick
If possible, do at the same time with
other apps