Я знаю, что есть много тем, говорящих о производительности Reflection.
Даже официальные документы Java говорят, что Reflection медленнее, но у меня есть этот код:
public class ReflectionTest {
public static void main(String[] args) throws Exception {
Object object = new Object();
Class<Object> c = Object.class;
int loops = 100000;
long start = System.currentTimeMillis();
Object s;
for (int i = 0; i < loops; i++) {
s = object.toString();
System.out.println(s);
}
long regularCalls = System.currentTimeMillis() - start;
java.lang.reflect.Method method = c.getMethod("toString");
start = System.currentTimeMillis();
for (int i = 0; i < loops; i++) {
s = method.invoke(object);
System.out.println(s);
}
long reflectiveCalls = System.currentTimeMillis() - start;
start = System.currentTimeMillis();
for (int i = 0; i < loops; i++) {
method = c.getMethod("toString");
s = method.invoke(object);
System.out.println(s);
}
long reflectiveLookup = System.currentTimeMillis() - start;
System.out.println(loops + " regular method calls:" + regularCalls
+ " milliseconds.");
System.out.println(loops + " reflective method calls without lookup:"
+ reflectiveCalls+ " milliseconds.");
System.out.println(loops + " reflective method calls with lookup:"
+ reflectiveLookup + " milliseconds.");
}
}
То, что я не считаю действительным эталоном, но, по крайней мере, должно показать некоторую разницу.
Я выполнил его, ожидая, что обычные вызовы с отражением будут немного медленнее, чем обычные.
Но это печатает это:
100000 regular method calls:1129 milliseconds.
100000 reflective method calls without lookup:910 milliseconds.
100000 reflective method calls with lookup:994 milliseconds.
Просто для заметки: сначала я выполнил его без этой кучки системных вызовов, а затем понял, что некоторая оптимизация JVM просто делает это быстрее, поэтому я добавил эти printls, чтобы посмотреть, было ли отражение еще быстрее.
Результат без sysout:
100000 regular method calls:68 milliseconds.
100000 reflective method calls without lookup:48 milliseconds.
100000 reflective method calls with lookup:168 milliseconds.
Я видел в интернете, что тот же тест, выполняемый на старых JVM, делает рефлексивное отображение без поиска в два раза медленнее, чем обычные вызовы, и эта скорость падает при новых обновлениях.
Если кто-то может выполнить это и сказать мне, что я неправ, или, по крайней мере, показать мне, если есть что-то отличное от прошлого, которое делает это быстрее.
Следуя инструкциям, я запустил каждый цикл отдельно, и результат (без sysouts)
100000 regular method calls:70 milliseconds.
100000 reflective method calls without lookup:120 milliseconds.
100000 reflective method calls with lookup:129 milliseconds.