一、下降執行時間html
這部分包括:緩存、數據存儲優化、算法優化、JNI、邏輯優化、需求優化幾種優化方式。算法
(1)緩存
緩存主要包括對象緩存、IO緩存、網絡緩存、DB緩存,對象緩存能減小內存的分配,IO緩存減小磁盤的讀寫次數,網絡緩存減小網絡傳輸,DB緩存較少Database的訪問次數。
在內存、文件、數據庫、網絡的讀寫速度中,內存都是最優的,且速度數量級差異,因此儘可能將須要頻繁訪問或訪問一次消耗較大的數據存儲在緩存中。數據庫
Android中常使用緩存:
a. 線程池
b. Android圖片緩存、Android圖片Sdcard緩存,數據預取緩存
c. 消息緩存
經過handler.obtainMessage複用以前的message,以下:json
handler.sendMessage(handler.obtainMessage(0, object));api
數據庫緩存http response,根據http頭信息中的Cache-Control域肯定緩存過時時間。數組
e.網絡緩存緩存
d.ListView緩存安全
f. 文件IO緩存
使用具備緩存策略的輸入流,BufferedInputStream替代InputStream,BufferedReader替代Reader,BufferedReader替代BufferedInputStream.對文件、網絡IO皆適用。
g.layout緩存
h. 其餘須要頻繁訪問或訪問一次消耗較大的數據緩存服務器
(2)數據庫優化
包括數據類型、數據結構的選擇。網絡
a、數據類型優化
字符串拼接用StringBuilder代替String,在非併發狀況下用StringBuilder代替StringBuffer。若是你對字符串的長度有大體瞭解,如100字符左右,能夠直接new StringBuilder(128)指定初始大小,減小空間不夠時的再次分配。
64位類型如long double的處理比32位如int慢
使用SoftReference、WeakReference相對正常的強應用來講更有利於系統垃圾回收
final類型存儲在常量區中讀取效率更高
LocalBroadcastManager代替普通BroadcastReceiver,效率和安全性都更高
b、數據結構優化
常見的數據結構選擇如:
ArrayList和LinkedList的選擇,ArrayList根據index取值更快,LinkedList更佔內存、隨機插入刪除更快速、擴容效率更高。通常推薦ArrayList。
ArrayList、HashMap、LinkedHashMap、HashSet的選擇,hash系列數據結構查詢速度更優,ArrayList存儲有序元素,HashMap爲鍵值對數據結構,LinkedHashMap能夠記住加入次序的hashMap,HashSet不容許重複元素。
HashMap、WeakHashMap選擇,WeakHashMap中元素可在適當時候被系統垃圾回收器自動回收,因此適合在內存緊張型中使用。
Collections.synchronizedMap和ConcurrentHashMap的選擇,ConcurrentHashMap爲細分鎖,鎖粒度更小,併發性能更優。Collections.synchronizedMap爲對象鎖,本身添加函數進行鎖控制更方便。Android也提供了一些性能更優的數據類型,如SparseArray、SparseBooleanArray、SparseIntArray、Pair。
Sparse系列的數據結構是爲key爲int狀況的特殊處理,採用二分查找及簡單的數組存儲,加上不須要泛型轉換的開銷,相對Map來講性能更優。不過我不太明白爲啥默認的容量大小是10,是作過數據統計嗎,仍是說如今的內存優化不須要考慮這些東西,寫16會死嗎,仍是建議你們根據本身可能的容量設置初始值。
(3)算法優化
這個主題比較大,須要具體問題具體分析,儘可能不用O(n*n)時間複雜度以上的算法,必要時候可用空間換時間。
查詢考慮hash和二分,儘可能不用遞歸。
(4)JNI
Android應用程序大都經過Java開發,須要Dalvik的JIT編譯器將Java字節碼轉換成本地代碼運行,而本地代碼能夠直接由設備管理器直接執行,節省了中間步驟,因此執行速度更快。不過須要注意從Java空間切換到本地空間須要開銷,同時JIT編譯器也能生成優化的本地代碼,因此糟糕的本地代碼不必定性能更優。
這個優化點會在後面單獨用一片博客介紹。
(5)邏輯優化
這個不一樣於算法,主要是理清程序邏輯,減小沒必要要的操做。
二、異步、使用多線程提高程序性能
充分利用多核Cpu優點,利用線程解決密集型計算、IO、網絡等操做。
在Android應用程序中因爲系統ANR的限制,將可能形成主線程超時操做放入另外的工做線程中。在工做線程中能夠經過handler和主線程交互。
三、提早或者延遲操做
(1)延遲操做
不在Activity、Service、BroadcastReceiver的生命週期等對響應時間敏感函數中執行耗時操做,可適當delay。
Java中延遲操做可以使用ScheduledExecutorService,不推薦使用Timer.schedule;
Android中除了支持ScheduledExecutorService以外,還有一些delay操做,如
handler.postDelayed,handler.postAtTime,handler.sendMessageDelayed,View.postDelayed,AlarmManager定時等。
(2)提早操做
對於第一次調用較耗時操做,可統一放到初始化中,將耗時提早。如獲得壁紙wallpaperManager.getDrawable();
四、網絡優化
如下是網絡優化中一些客戶端和服務器端須要儘可能遵照的準則:
a. 圖片必須緩存,最好根據機型作圖片作圖片適配
b. 全部http請求必須添加httptimeout
c. 開啓gzip壓縮
d. api接口數據以json格式返回,而不是xml或html
e. 根據http頭信息中的Cache-Control及expires域肯定是否緩存請求結果。
f. 肯定網絡請求的connection是否keep-alive g. 減小網絡請求次數,服務器端適當作請求合併。 h. 減小重定向次數 i. api接口服務器端響應時間不超過100ms