boscoworks.log

boscoworksのブログ的な

Android 高速化テクニック

全く違うことを勉強しようと思って、ちょっと古めの技術雑誌を買ったら、たまたまAndroidについて記事があったので、軽く目を通してみました。
1年前の雑誌なので、ハードウェア的にもAndroid的にも向上はしていると思うのですが、まぁそこはご愛嬌。
Androidデベロッパーとしては、こういう時代もあった、みたいなことも知っておくのも、まぁいいんじゃないすかね。

1. インスタンス生成の抑制

  • インスタンスのヒープへの確保→インスタンスの初期化 のステップが、インスタンス生成時に毎回発生
  • ヒープが空きがない場合、Garbage Collection(不要なオブジェクトを回収してヒープの空きを作る)が発生→GC実行中は全スレッドが停止→遅い
  • インスタンスを使いまわして生成を抑止=オブジェクトプール

2. ローカル変数へのキャッシュ

  • ダメな例
for(int i = 0; i < inst.getSize(); i++) {
    inst.getIndex(i);
}
  • よい例
int size = inst.getSize();
for(int i = 0; i < size; i++) {
    inst.getIndex(i);
}

3. インスタンス変数のキャッシュ

  • ダメな例
private int n = 0;

public void call_bad_sample() {
    n = 1 + n;
    n = 2 + n;
    n = 3 + n;
    n = 4 + n;
    n = 5 + n;
}
  • よい例
private int n = 0;

public void call_good_sample() {
    int tmp = n;

    tmp = 1 + tmp;
    tmp = 2 + tmp;
    tmp = 3 + tmp;
    tmp = 4 + tmp;
    tmp = 5 + tmp;

    n = tmp;
}

4. スタティックメソッドの活用

5. 浮動小数点演算はなるべく使わない

  • 整数演算に比べて遅いから

6. 数はstatic finalで定義する
よくわかんなかった。誰か教えて。

7. ポリモーフィズムの使用を控える

  • 実装のコード呼び出しの際のオーバーヘッドを減らすため。

8. オブジェクト指向プログラミングをやめる

  • 生産性を犠牲にしてオーバーヘッドを減らす。

9. 描画の高速化

  • Canvasの描画:アプリケーション側のスレッドで制御
  • SurvaceViewの描画:ハードウェアアクセラレータを使用可能

10. Android Native Development Kit の活用

  • JavaからC/C++で書いたネイティブコードを呼び出すためのインターフェース
  • ネイティブコードを呼び出すことで処理速度向上
  • JNI自体の呼び出しにかかるオーバーヘッドが通常のJavaメソッドの呼び出しに比べて大きいのが難点


なんか後半やけっぱちな論理展開に見えなくもないですが。
それだけメモリ管理にはナイーブにならなきゃいけないってことですね。

文献:
Android 高速化テクニック(組み込みプレスVol.16 掲載) 
株式会社イーフロー 中川輪土
http://www.eflow.jp/common/pdf/090828/eflow-android-toku-2-3sho.pdf