Я был microbenchmarking какой-то код (пожалуйста, будь красивым) и наткнулся на эту головоломку: при чтении поля с использованием отражения вызов метода getter быстрее, чем чтение поля.Java-отражение При вызове метода результат получается быстрее, чем поля?
Простой тестовый класс:
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
}
У нас есть два отражения:
Method m = Foo.class.getDeclaredMethod("getVal", null);
Field f = Foo.class.getDeclaredField("val");
Теперь я называю два отражения в цикле, invoke
о методе, и get
на поле. Первый запуск выполняется для разогрева виртуальной машины, второй запуск выполняется с помощью итераций 10M. Вызов метода последовательно на 30% быстрее, но почему? Обратите внимание, что getDeclaredMethod и getDeclaredField: не, вызываемые в цикле. Они вызывается один раз и выполняется на одном и том же объекте в цикле.
Я также пробовал некоторые незначительные вариации: сделал поле незавершенным, переходным, непубличным и т. Д. Все эти комбинации привели к статистически подобной производительности.
Редактировать: Это на WinXP, Intel Core2 Duo, Sun JavaSE build 1.6.0_16-b01, работающий под jUnit4 и Eclipse.
У вас возникли проблемы? –
Это предложение выделено жирным шрифтом. – omerkudat