Снижение производительности для Hibernate и Spring из-за отражения - PullRequest
5 голосов
/ 10 июня 2009

Spring и Hibernate используют отражение для создания бина (в случае весны) и отображения POJO (в случае Hibernate). Влияет ли это негативно на производительность? Поскольку отражение медленнее, сравните с прямым созданием объекта.

Ответы [ 5 ]

15 голосов
/ 10 июня 2009

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

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

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

Как всегда, если у вас есть проблемы, оцените и профилируйте реалистичный сценарий.

10 голосов
/ 10 июня 2009

Несмотря на снижение производительности, оно относительно низкое и может считаться незначительным. Ключевой вопрос здесь заключается в том, что вы получаете выгоду от использования ORM (с отражением) намного перевешивает очень маленький штраф за производительность, который вы платите.

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

10 голосов
/ 10 июня 2009

Ознакомьтесь с Разделом вопросов и ответов Hibernate в FAQ , это почти все вопросы создания экземпляров

В самых последних версиях Спящий режим, «отражение» оптимизировано через байт-код времени выполнения CGLIB поколение библиотеки. Это означает, что свойство «отраженного» получить / установить вызовы больше не несут накладные расходы API отражения Java и на самом деле просто обычные вызовы методов. Это результаты в (очень) небольшом приросте производительности.

2 голосов
/ 10 июня 2009

Вероятность значительных издержек отражения незначительна при любом разумном применении. (всегда есть необоснованные приложения:)

Для сравнения; Запустите ваше приложение через профиль и посмотрите, сколько памяти / процессора используется драйвером JDBC.

Важной особенностью hibernate и spring является то, что они предназначены для оптимизации вашей производительности и повышения производительности и надежности кода.

UPDATE: Я думаю, что смысл, который пытаются сделать я и г-н Скит, заключается в том, что снижение производительности при использовании отражения в этих рамках является незначительным. Это в сочетании с тем фактом, что рефлексия является жизненно важной частью реализации этих структур, означает, что выбора практически нет.

1 голос
/ 10 июня 2009

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

Предположим, что для извлечения и увлажнения 100 сущностей Spring + Hibernate добавит служебную информацию в 3 миллисекунды.

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

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