Реализация гибернации. Мы платим штраф за отражение? - PullRequest
5 голосов
/ 14 февраля 2009

Давным-давно я создавал мини-ОРМ с использованием отражения.

Читая об отражении, я получил похожий ответ:

Производительность Java Reflection

Это имеет смысл, и я ухожу из своей мини-формы и оттачиваю свои клавиши CTRL + C, CTRL + V (библиотека предназначена для того, чтобы избежать необходимости перезаписывать снова и снова одни и те же фрагменты для разных таблиц в веб-приложении, над которым я работал вкл)

Спустя годы по какой-то причине я не помню сейчас (и не хочу вспоминать), что я читал (или пытался ...) исходный код Hibernate, потому что я хотел знать, используют ли они AOP для генерации кода на летать и избежать штрафа за отражение, но, к моему удивлению, все, что я увидел, было чистым отражением.

Означает ли это наиболее приемлемую структуру ORM, неужели именно в те годы, прежде чем отговорить меня от продолжения моих наивных усилий? : ")

Мой вопрос: может ли кто-нибудь подтвердить мое понимание реализации Hibernate? Они генерируют байт-код на лету, чтобы улучшить производительность? Или мы (когда мы его используем) всегда платим штраф за отражение (что, кстати, если разность составляет несколько мс, никто из нас не заметил и не пожаловался)

Мы платим штраф за отражение? Если мы, я думаю, это стоит стоит !!!

Привет.

Ответы [ 5 ]

9 голосов
/ 14 февраля 2009

Я думаю, что важно помнить об относительной стоимости всего приложения. Отражение медленнее, чем создание нормального объекта? Да. Рефлексия стала лучше и быстрее? Да. Но на самом деле эти моменты не очень важны при сравнении затрат на рефлексию и переходов по проводам и выполнения каких-либо действий с базой данных, что и делает Hibernate - стоимость становится совершенно незначительной, и я бы сказал, что мы не платим цену.

8 голосов
/ 14 февраля 2009

Hibernate инструменты ваших моделей, чтобы быть в курсе гибернации.

Существуют различные уровни стоимости использования Reflection. Постоянно искать метод для определенного класса особенно дорого. Выполнение метода с помощью отражения с использованием кэшированной копии не намного медленнее. Если кто-то думает о задачах, которые API-интерфейс отражения должен выполнить, чтобы вызвать метод, то все имеет смысл, какая часть медленная и потребляет циклы ЦП.

Поиск метода

  • Посещение каждого метода определенного класса
  • Проверка видимости каждого метода, сигнатуры метода и т. Д.
  • Создать байт-код для найдено метод.

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

Вызов метода.

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

  • Если метод экземпляра проверяет, что экземпляр, переданный в, не равен нулю и имеет правильный тип.
  • Проверьте, что параметр arguments включает правильное количество и тип параметров.
  • Выполнить метод в try catch. В ловушку киньте ITE и т. Д.

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

Стоимость выполнения

В общем, методы кеширования и вызовы это не дорого, но немного медленнее. API-интерфейс отражения пытается кэшировать методы и классы, но поиск правильного метода и т. Д. Все еще является медленной операцией.

4 голосов
/ 14 февраля 2009

Стоимость постоянства и поиска во много раз превышает стоимость размышления. Для доступа к записи из БД может потребоваться 1-10 мс, а для построения объекта с отражением может потребоваться от 0,001 до 0,01 мс.

1 голос
/ 14 февраля 2009

Разве NHibernate не кэширует информацию о классе, собранную с помощью рефлексии, поэтому вы платите только штраф в первый раз?

0 голосов
/ 30 декабря 2014

Вы действительно платите штраф за отражение, используя NHibernate, но его расширяемость позволяет вам избежать 90% из них, если вы предоставляете все оптимизированные реализации отражения через NHibernate.Bytecode.IBytecodeProvider.

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