Почему идентичные запросы NHibernate выполняются на порядок медленнее в проекте WinForm, чем в модульном тесте MSTest?
У меня есть приложение, которое запускается в качестве службы на производстве, но мы проводим некоторое ручное тестирование с простым графическим интерфейсом - в нем практически ничего не происходит, это просто оболочка с текстовым полем для ввода.
Недавно я изменил схему базы данных и обновил сопоставления, чтобы соответствовать, а затем GUI неожиданно работал очень медленно в тривиальном случае. После некоторой регистрации и многократного запуска выяснилось, что новым узким местом был следующий запрос:
public void Refresh()
{
using (var session = _sessionFactory.OpenSession())
{
_allFields = session.Query<FieldDefinition>().ToList();
}
}
Неоднократно для этого одного метода требовалось 1:08 минуты (хотя в базе данных было только около 300 FieldDefinitions). К этому времени я устал от ручного перезапуска GUI, поэтому я написал модульный тест, который выполнял точно такой же случай - но я не смог воспроизвести замедление.
Мой тест вызвал тот же объект верхнего уровня, что и GUI с тем же вводом. Я ожидаю, что это будет проходить в почти одинаковое количество времени. Но при запуске в Visual Studio с MSTest этот же запрос занимал менее двух секунд. Это 1/30 времени. Он делал ту же самую работу, только значительно быстрее.
Вещи, которые я проверил, чтобы увидеть, смогу ли я заставить их работать так же:
- Оба подхода дали одинаковое количество операторов SQL.
- Кажется, это не вызвано JITter (несколько запусков GUI без перезапуска, одни и те же результаты появляются снова и снова)
- Изолировать его так, чтобы он использовал совершенно новый
ISessionFactory
для каждогоRefresh
не имел никакого эффекта - Отключение логирования (log4net) не дало эффекта
Изменение запроса, чтобы нетерпеливо загрузить ребенка , сработало... вроде: После применения исправления приложение WinForms работает так же быстро, как и модульный тест. Скорость юнит-теста существенно не изменилась (десятые доли секунды).
Старый запрос вызывал select n+1
Проблема: но проблема присутствовала как в Winform, так и в MSTest. Только приложение WinForm увидело значительное замедление из-за этого.
Как я могу это объяснить? Почему только приложение WinForm испытало бы значительное замедление во время запроса Select N+1?