リフレクションとJITの効果
リフレクションネタも今日のエントリで一区切りだ。
#Android 2.2ではJITが導入されているが、今回はその有無による性能差を計測することができなかった。(エミュレータはJITオフだと思うが、実機と比較はできない)実機でJITを簡単に切替える方法が解れば追試したい所だ
Androidとリフレクションについて
すっかり忘れていたが、Android 2.2で導入されたJITの有効/無効は簡単に切替えることができる。
Android 2.2はデフォルトではJITが有効だが、マニフェストのapplication要素に新たな属性"android:vmSafeMode"が追加されており、これをtrueに設定することでJITを無効にできる。
android:vmSafeMode="true"|"false"
以下、先日と同様のテストを用いてAndroid 2.2のエミュレータとNexus oneでJITの有無の差を検証してみる。
タスク | JIT Off | JIT On |
---|---|---|
メソッド呼び出し | 236msec | 233msec |
フィールドアクセス | 292msec | 288msec |
リフレクション-メソッド(検索時間を含まず) | 2373msec | 2406msec |
リフレクション-メソッド(検索時間を含む ) | 7757msec | 7874msec |
リフレクション-フィールド(検索時間を含まず) | 790msec | 767msec |
リフレクション-フィールド(検索時間を含む ) | 3083msec | 3040msec |
-
- Nexus one (FRF91)
タスク | JIT Off | JIT On | |
---|---|---|---|
メソッド呼び出し | 51msec | 36msec | |
フィールドアクセス | 37msec | 29msec | |
リフレクション-メソッド(検索時間を含まず) | 703msec | 498msec | |
リフレクション-メソッド(検索時間を含む ) | 2514msec | 2010msec | |
リフレクション-フィールド(検索時間を含まず) | 194msec | 165msec | |
リフレクション-フィールド(検索時間を含む ) | 1097msec | 678msec |
エミュレータに関してはJITの有無で殆どが差が出ていない。これはJITが効いていないのではなく、そもそもエミュレータではJITが有効になっていないと思われる。※1
Nexus oneに関してはJITの効果が判るが、今回のテストのようにDalvikVMの使用率が高くない(フィールドへのアクセスやメソッドの呼び出しはネィティブコードの割合が高い)ケースではJITの有無による差はあまり大きくならないのだろう。(一番差が大きいタスクで1.4〜1.6倍か)※2
※1 デバッグ時にJITが有効になっているといろいろと困るのだろう。
※2 Dalvikの使用率が高いケースでは2〜5倍の性能差が出るとされている -> A JIT Compiler for Android's Dalvik VM