做Android開發者,這些不得不看呢:
我個人認為,與其糾纏在效能的細節裡,不如偏重一點編寫速度和功能吧。
我會先了解一些跟效能有關的要點,但編寫時用一些快捷的手段寫好代碼、功能等等,測試好後才花時間做 profiling。想想,就算很詳盡的設計,到頭來都花很多時間修改,花太多心思寫優美的代碼不如先快快完成吧。
Anyway,以下是一些重點(節錄,詳情看原文):
- 先了解好目標機的Android版本,其中有一個大原因是 JIT,如果目標機的Android版本低於 2.2 Foyo (即 2.1 Eclair 或以下),這些舊版本並未有 JIT (Just-in-time compiler)。因為JIT對效能影響大,所以若果沒有須要寫APP給舊版機用,那考慮就可以少一些了。
- 沒有必要就不要 Create Object。
- 操作 String 時,避免 new String Object,可考慮用 substring ,因為 substring 不會增加所用到的記憶,而是共用 char[] 。
- 多考慮 primate type,而非 wrapper class (如 int v.s. Integer)
- 盡量把 multi-dimensional array 分拆為多個平行的single dimensional arrays
- 如果 Method 沒有用到 Object 內的 field/member,把這些寫成 static method.
- Lookup/Call 一個 Method 是有所付出的 (即所謂 "accessors are slower than direct field accesses" ),如果 call method 是為了取得 value/object,那先call 一次method,把值寫到本地變數 (local variable),用這來取代不斷的呼叫同一個 Method 。
- 減少 Getter/Setter,選用直接方式存取 Object 內的 field/member,雖然這有點違反 OOP 的理念,但所換來的速度是相對值得的。咦! 怪不得寫遊戲時的其中一個考慮是不多用OOP了....
- Constant 值,就用 static final 吧!
- 小心處理 Loop:
- 懂得用 for (Foo a : mArray) {...},就用它,這個最快!
- 在 Loop 之前,先把 Collection/Array 的資料長度讀出到一個本地變數 (local variable),即: int len = data.length(); for (int i=0;i<len;i++){...} 來代替 for (int i=0;i<data.length();i++){...}
- 可以的話,少用floating-point,integer 是最快的。或者,能夠考慮精度的話,先轉換到 integer 或 long,做完大堆計算後才轉換回 float 或 double。
- 多用Android 已提供的 API/Library,少用3rd party library,少用自己重複寫已在Library有的功能! 結論是:- 多閱讀/找找 API manual/web,找找有沒有合適的吧,很多時是意想不到呢。
- 如果有用 Inner Class ,應避免從 Inner Class 裡 access outer class 的 private member/private method! 解決方法是把 outer class 的 private access 變為 package access。不過這些 member/method 就再不是 private 了... 不理想呢。
- 話說用到 EventListener 就經常會有這情況 (用 Anonymous Inner Class),但如果真的要 access 到 outer class,那麼可以直接在那個 class 中 implements 那些 listener。
更多參考:
沒有留言:
發佈留言