Почему идентичные запросы 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?

1 ответ

Я бы сказал, профиль, то вы будете знать.

Другие вопросы по тегам