Оптимизатор оптимизаций NHibernate - что он делает?

Я обнаружил, что инициализация моей сессии factory намного быстрее, когда я отключу оптимизатор отражения nhibernate. Это отлично подходит для тестирования.

<add key="hibernate.use_reflection_optimizer" value="false" />

Мой вопрос в том, каков эффект постучивания этого, и почему он не является настройкой по умолчанию? Кажется, что все работает одинаково.

Ответы

Ответ 1

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

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

  • codedom, который в основном сгенерирован, а затем скомпилирован код (т.е. nhibernate генерирует код Getter/Setter для ваших сущностей и затем компилирует его). По внешнему виду это работает только на публичных участниках и, вероятно, дорого стоит использовать, потому что он наивно генерирует классы-оболочки (независимо от того, открыто ли какое-либо поле), пытается скомпилировать его и выдает исключение, если оно терпит неудачу.

  • создание легкого кода, в котором используется оккультная практика reflection.emit для получения/установки значений. Это все еще очень новая область для меня, но личные эксперименты с это показывают, что вы можете использовать SRE для быстрого управления частными переменными, а source, по-видимому, обеспечивает эмиссию для основных полей/свойств независимо от модификатора доступа. Это значение по умолчанию.

Что касается эффекта детонации - ну, из блестящих графиков в 1, похоже, если вы сохраняете/увлажняете много тяжелых объектов во время разработки, это может быть довольно существенным. Если нет (и я рискую предположить, что вы не во время тестирования/разработки), то кажется разумным отключить его.

Ответ 2

Из документация:

Позволяет использовать созданный во время выполнения класс для установки или получения свойств сущности или компонента вместо использования отражение во время выполнения (системный уровень имущество). Использование отражения оптимизатор запускает определенный запуск затраты на приложение, но должны приводят к повышению производительности в запустить. Вы не можете установить это свойство в hibernate.cfg.xml или  раздел файл конфигурации приложения.

Ответ 3

От https://www.hibernate.org/hib_docs/nhibernate/html/session-configuration.html

Позволяет использовать класс, созданный во время выполнения, для установки или получения свойств объекта или компонента вместо использования отображения времени выполнения (свойство системного уровня). Использование оптимизатора отражения накладывает определенную стоимость запуска на приложение, но должно привести к повышению производительности в долгосрочной перспективе. Вы не можете установить это свойство в файле hibernate.cfg.xml или разделе файла конфигурации приложения.