2012年2月8日

一些關於Android (或 JAVA) 開發的效能考慮

Android (甚至 Java) 開發,考慮效能是理所當然的重要。所以今天上網找找,看到了一些不錯的資料呢。

做Android開發者,這些不得不看呢:


我個人認為,與其糾纏在效能的細節裡,不如偏重一點編寫速度和功能吧。
我會先了解一些跟效能有關的要點,但編寫時用一些快捷的手段寫好代碼、功能等等,測試好後才花時間做 profiling。想想,就算很詳盡的設計,到頭來都花很多時間修改,花太多心思寫優美的代碼不如先快快完成吧。

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

更多參考:

沒有留言:

發佈留言