全く違うことを勉強しようと思って、ちょっと古めの技術雑誌を買ったら、たまたまAndroidについて記事があったので、軽く目を通してみました。
1年前の雑誌なので、ハードウェア的にもAndroid的にも向上はしていると思うのですが、まぁそこはご愛嬌。
Androidデベロッパーとしては、こういう時代もあった、みたいなことも知っておくのも、まぁいいんじゃないすかね。
- Androidは遅い?
- Embedded Caffeine Markというベンチマークによると、携帯Javaと比べてAndroidは2倍から10倍くらい遅くなってしまう
- 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. スタティックメソッドの活用
- インスタンス生成のコストがかからない
- インスタンスメソッドを呼び出すDalvikVMのinvoke-virtual命令 > スタティックメソッドを呼び出すDalvikVMのinvoke-static命令
5. 浮動小数点演算はなるべく使わない
- 整数演算に比べて遅いから
6. 数はstatic finalで定義する
よくわかんなかった。誰か教えて。
7. ポリモーフィズムの使用を控える
- 実装のコード呼び出しの際のオーバーヘッドを減らすため。
8. オブジェクト指向プログラミングをやめる
- 生産性を犠牲にしてオーバーヘッドを減らす。
9. 描画の高速化
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