Google近期在Udacity上發佈了Android性能優化的在線課程,分別從渲染,運算與內存,電量幾個方面介紹瞭如何去優化性能,這些課程是Google以前在Youtube上發佈的Android性能優化典範專題課程的細化與補充。android
下面是運算篇章的學習筆記,部份內容與前面的性能優化典範有重合,歡迎你們一塊兒學習交流!算法
Android中的Java代碼會須要通過編譯優化再執行的過程。代碼的不一樣寫法會影響到Java編譯器的優化效率。例如for循環的不一樣寫法就會對編譯器優化這段代碼產生不一樣的效率,當程序中包含大量這種可優化的代碼的時候,運算性能就會出現問題。想要知道如何優化代碼的運算性能就須要知道代碼在硬件層的執行差別。性能優化
若是你寫了一段代碼,它的執行效率比想象中的要差不少。咱們須要知道有哪些因素有可能影響到這段代碼的執行效率。例如:比較兩個float數值大小的執行時間是int數值的4倍左右。這是由於CPU的運算架構致使的,以下圖所示:架構
雖然現代的CPU架構獲得了很大的提高,也許並不存在上面所示的那麼大的差別,可是這個例子說明了代碼寫法上的差別會對運算性能產生很大的影響。app
一般來講有兩類運行效率差的狀況:第1種是相對執行時間長的方法,咱們能夠很輕鬆的找到這些方法並作必定的優化。第2種是執行時間短,可是執行頻次很高的方法,由於執行次數多,累積效應下就會對性能產生很大的影響。工具
修復這些細節效率問題,須要使用Android SDK提供的工具,進行仔細的測量,而後再進行微調修復。性能
經過Android Studio打開裏面的Android Device Monitor,切換到DDMS窗口,點擊左邊欄上面想要跟蹤的進程,再點擊上面的Start Method Tracing的按鈕,以下圖所示:學習
啓動跟蹤以後,再操控app,作一些你想要跟蹤的事件,例如滑動listview,點擊某些視圖進入另一個頁面等等。操做完以後,回到Android Device Monitor,再次點擊Method Tracing的按鈕中止跟蹤。此時工具會爲剛纔的操做生成TraceView的詳細視圖。優化
關於TraceView中詳細數據如何查看,這裏不展開了,有不少文章介紹過。spa
爲了提高運算性能,這裏介紹2個很是重要的技術,Batching與Caching。
Batching是在真正執行運算操做以前對數據進行批量預處理,例如你須要有這樣一個方法,它的做用是查找某個值是否存在與於一堆數據中。假設一個前提,咱們會先對數據作排序,而後使用二分查找法來判斷值是否存在。咱們先看第一種狀況,下圖中存在着屢次重複的排序操做。
在上面的那種寫法下,若是數據的量級並不大的話,應該還能夠接受,但是若是數據集很是大,就會有嚴重的效率問題。那麼咱們看下改進的寫法,把排序的操做打包綁定只執行一次:
上面就是Batching的一種示例:把重複的操做拎出來,打包只執行一次。
Caching的理念很容易理解,在不少方面都有體現,下面舉一個for循環的例子:
上面這2種基礎技巧很是實用,積極恰當的使用可以顯著提高運算性能。
提高代碼的運算效率是改善性能的一方面,讓代碼執行在哪一個線程也一樣很重要。咱們都知道Android的Main Thread也是UI Thread,它須要承擔用戶的觸摸事件的反饋,界面視圖的渲染等操做。這就意味着,咱們不能在Main Thread裏面作任何非輕量級的操做,相似I/O操做會花費大量時間,這頗有可能會致使界面渲染髮生丟幀的現象,甚至有可能致使ANR。防止這些問題的解決辦法就是把那些可能有性能問題的代碼移到非UI線程進行操做。
另一個咱們須要注意的運算性能問題是基礎算法的合理選擇,例如冒泡排序與快速排序的性能差別:
避免咱們重複造輪子,Java提供了不少現成的容器,例如Vector,ArrayList,LinkedList,HashMap等等,在Android裏面還有新增長的SparseArray等,咱們須要瞭解這些基礎容器的性能差別以及適用場景。這樣纔可以選擇合適的容器,達到最佳的性能。