Почему медленное отражение? - PullRequest
22 голосов
/ 17 августа 2010

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

Ответы [ 5 ]

30 голосов
/ 17 августа 2010

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

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

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

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

6 голосов
/ 17 августа 2010

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

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

Как и сама Java, рефлексия больше не медленная - это скорее старый слух;)1005 *

2 голосов
/ 21 января 2011

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

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

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

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

0 голосов
/ 04 июня 2019

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

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

0 голосов
/ 10 января 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...