続 リフレクションはやっぱり重いのか?
昨日の続き。フィールド値の読み込みなど、他に気になっている操作についても測ってみました。
- 特定の処理を50万回実行した場合の合計所要時間を計測する。(←回数を増やした)
- 10回試行し平均を取得。
- JRE1.4,1.5,1.6でそれぞれ測る。
- 書き忘れたけど、計測マシンは CPU: Pentium4 2.8Ghz、メモリ:1GB です。
結果
まとめ
メソッドの呼び出し
setメソッドの呼び出しを、
の3つの方法で行い、所要時間を計測。
JDK1.42_08 | JDK1.5.0_09 | JDK1.6update1 | |||||
---|---|---|---|---|---|---|---|
メソッド呼び出し | 6msec | 6msec | 6msec | ||||
リフレクションを使う(メソッド検索時間は含まない) | 381msec | 401msec | 278msec | ||||
リフレクションを使う(メソッド検索時間を含む) | 2704msec | 3846msec | 2789msec |
フィールドから値の読み込み
フィールドからの値の読み込みを、
- 「通常のフィールド参照」
- 「リフレクションを使った読み込み(フィールド検索時間は含まない)」
- 「リフレクションを使った読み込み(フィールド検索時間を含む)」
の3つの方法で行い、所要時間を計測。
JDK1.42_08 | JDK1.5.0_09 | JDK1.6update1 | |||||
---|---|---|---|---|---|---|---|
通常のフィールド参照 | 4msec | 4msec | 4msec | ||||
リフレクションを使った読み込み(フィールド検索時間は含まない) | 492msec | 578msec | 412msec | ||||
リフレクションを使った読み込み(フィールド検索時間を含む) | 3317msec | 3671msec | 2760msec |
フィールドへの値の書き込み
フィールドへの値の書き込みを、
- 「通常のフィールドへの代入」
- 「リフレクションを使った書き込み(フィールド検索時間は含まない)」
- 「リフレクションを使った書き込み(フィールド検索時間を含む)」
の3つの方法で行い、所要時間を計測。
JDK1.42_08 | JDK1.5.0_09 | JDK1.6update1 | |||||
---|---|---|---|---|---|---|---|
通常のフィールド代入 | 6msec | 6msec | 6msec | ||||
リフレクションを使った書き込み(フィールド検索時間は含まない) | 540msec | 651msec | 443msec | ||||
リフレクションを使った書き込み(フィールド検索時間を含む) | 2685msec | 4290msec | 2281msec |
instanceof
クラスの実装であるかどうかの判定を、
- 「str instanceof String」
- 「String.class.isInstance( str )」
- 「String.class.isAssignableFrom( str.getClass() )」
の3つの方法で行い、所要時間を計測。
JDK1.42_08 | JDK1.5.0_09 | JDK1.6update1 | |||||
---|---|---|---|---|---|---|---|
str instanceof String | 4msec | 9msec | 6msec | ||||
String.class.isInstance( str ) | 37msec | 34msec | 32msec | ||||
String.class.isAssignableFrom( str.getClass() ) | 43msec | 43msec | 34msec |