リフレクションと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