第2回 リフレクション入門

http://www-6.ibm.com/jp/developerworks/java/030808/j_j-dyn0603.html

最初の2つの呼び出しは、祖先クラスから継承されたフィールドであったとしても、そのクラスを通してアクセスされるパブリック・フィールドについての情報を返すという点です。これに対して後の2つの呼び出しは、フィールドのアクセス・タイプには関係なく、そのクラスで直接宣言されたフィールドについての情報を返します。

サブクラスでフィールドを上書きして隠蔽したらどうなるんだろう?ってそのままか。

配列を特殊な方法で扱うには java.lang.reflect.Array クラスで提供されている静的メソッドのコレクションを使用します。

図の最初の2つ (いずれもSunのJVM) では、リフレクションでの実行時間は直接アクセスによる場合の千倍以上になっています。それに比べIBMJVMでは少し良い結果になっていますが、それでもリフレクション・メソッドは他のメソッドの700倍以上の時間を要しています。

リフレクションは遅い。それはわかるけど、フィールドのアクセスで1000倍、メソッド呼び出しで30倍、って言われるとなんかずいぶん遅く感じてしまうのではないかと思う。実際には、

本稿のテスト実行は1GHzのPIIImシステムで行い、それぞれの呼び出しのループ・カウントは1千万回としました。

ということは、グラフから読み取れる範囲で、

  • フィールドアクセス
    • 素 1E-6[ms]
    • リフレクション 1E-3[ms]
  • メソッド呼び出し
    • 素 1E-6[ms]
    • リフレクション 3E-5[ms]

くらいだから、数百回とか数千回のアクセスがあってはじめて1ms程度の差が出てくることになる。よっぽど重く辛い処理を続けるとかいう状況でなければ、目くじら立てるような差ではない気がする。数千万件のデータ処理とかだったら、気にしたほうがいいと思うけど。

関係ないけど呼び出しのほうがデータ操作より速いのね。