私はいくつかのコードを素早くマークしていました(いいですね)、このパズルを見つけました。リフレクションを使用してフィールドを読むとき、getterメソッドを呼び出す方がFieldを読み込むよりも速いです。Javaリフレクションメソッドの呼び出しでは、結果がFieldsより速くなりますか?
簡単なテストクラス:
Method m = Foo.class.getDeclaredMethod("getVal", null);
Field f = Foo.class.getDeclaredField("val");
は、今私は、ループ内で2回反射を呼び出すフィールド上手法に関する
invoke
、および
get
:
private static final class Foo {
public Foo(double val) {
this.val = val;
}
public double getVal() { return val; }
public final double val; // only public for demo purposes
}
我々は2回の反射を持っています。最初の実行はVMをウォームアップするために実行され、2回目の実行は10Mの繰り返しで実行されます。 メソッド呼び出しは一貫して30%高速ですが、なぜですか? getDeclaredMethodとgetDeclaredFieldはであり、ループ内では呼び出されていません。です。それらは一度呼び出され、ループ内の同じオブジェクトに対して実行されます。
私はまた、いくつかのマイナーなバリエーションを試しました。フィールドを非最終、推移、非公開などにしました。これらの組み合わせのすべてが統計的に同じパフォーマンスをもたらしました。
編集:これはWinXP、Intel Core2 Duo、Sun JavaSEビルド1.6.0_16-b01、jUnit4とEclipseで動作します。
質問がありますか? –
これは太字の文章です。 – omerkudat