Подтвердить что ты не робот

Почему отражение медленно?

Это потому, что мы должны загружать класс (например, string), создавать экземпляр, затем искать соответствующий метод, параметры пакета, а затем просто вызывать метод? Поэтому большинство времени тратится на эти операции вместо явного вызова метода на объект, правильно?

4b9b3361

Ответ 1

Каждый шаг, который вы принимаете, должен быть проверен каждый раз, когда вы принимаете его, когда используете отражение. Например, когда вы вызываете метод, ему нужно проверить, действительно ли объект является экземпляром объявления метода, независимо от того, имеется ли у вас правильное количество аргументов, независимо от того, имеет ли каждый аргумент правильный тип и т.д.

Абсолютно никакой возможности встраивания или других трюков производительности.

Если вы находите типы или методы по имени, это в лучшем случае будет включать простой поиск по карте - который будет выполняться каждый раз, когда вы его выполняете, а не один раз во время JIT.

В принципе, есть еще много дел. Тем не менее, отражение стало намного быстрее, чем раньше... если вы находите его слишком медленным, вы вполне можете злоупотреблять им.

Ответ 2

В качестве дополнения к Jon Skeet ответ выше (мне нужно больше репутации, чтобы иметь возможность комментировать.):

Отражение зависит от доступных ресурсов ЦП; если у вас проблемы с медленным приложением, отражение ничего не решит, просто сделайте это медленнее.

Как и сама Java, отражение уже не медленное - это скорее старый слух;)

Ответ 3

Когда вы вызываете метод, вам нужно знать, действуете ли вы с действительными аргументами, на действительном объекте, каков тип возвращаемого значения и какой исполняемый байт-код. Когда точный метод указан в коде, java может быстро вычислить этот материал и перейти к фактическому выполнению метода.

Когда вы делаете это с отражением, вы знаете намного меньше. Поскольку метод, который нужно вызвать, не был указан в коде, ни одно из этого не может быть сделано заранее, и виртуальная машина должна делать что-то во время выполнения, которое намного сложнее и интенсивнее.

Полиморфные вызовы методов могут быть, хотя и между этими двумя крайностями. Вы не знаете, какой метод вызывать до времени выполнения, но по крайней мере вы можете быть уверены в имени метода, аргументах и ​​типе возвращаемого значения. Чем больше вы знаете о том, какой метод выполнить, тем больше Java может избежать выполнения во время выполнения.

Это доказывает, что отражение медленнее, но не то, что оно на самом деле "медленное". Если вам нужны рефлексивные или полиморфные методы, используйте их и сохраняйте суждение о том, что является "медленным" для более позднего.

Ответ 4

Если вы используете его соответствующим образом, это не так медленно. Например, я использовал его для сканирования всего свойства класса модели, он работал отлично.

В других случаях, таких как проверка того, имеет ли цель тот же тип или подпись, он абсолютно медленный.

Событие какое-то время медленное, но важно для реализации вне коробки...: D.

Ответ 5

Согласно документации Oracle

Отражение медленнее. Поскольку оно включает типы, которые динамически разрешаются, некоторые оптимизации Java-виртуальных машин не могут быть выполнены. Следовательно, отражающие операции имеют более низкую производительность, чем их неотражающие аналоги, и их следует избегать в разделах кода, которые часто вызываются в чувствительных к производительности приложениях.