Проблема производительности отражения в Java

Я знаю, что есть много тем, говорящих о производительности 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, чтобы проверить, работает ли отражение по-прежнему быстрее.

Результат без sysouts:

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.
7
задан Marcos Vasconcelos 4 August 2011 в 20:28
поделиться