EF6/Code First: Супер медленный во время первого запроса, но только в Debug
Я использую EF6 rc1 со стратегией Code First без предварительно скомпилированных представлений, и проблема такова:
Если я компилирую и запускаю exe-приложение, для запуска первого запроса требуется 15 секунд (это нормально, так как я все еще работаю над предварительно сгенерированными представлениями). Но если я использую Visual Studio 2013 Preview для отладки точно такого же приложения, он занимает почти 2 минуты, прежде чем запускать первый запрос:
Dim Context = New MyEntities()
Dim Query = From I in Context.Itens '' <--- The debug takes 2 minutes in here
Dim Item = Query.FirstOrDefault()
Есть ли способ удалить это дополнительное время? Я здесь что-то не так?
Ps: Сам контекст не сложный, его просто полный 200 + таблиц.
Изменить: выяснилось, что проблема заключается в том, что во время отладки EF, похоже, генерирует представления, игнорируя предварительно сгенерированные.
Используя исходный код из EF, я обнаружил, что свойство:
IQueryProvider IQueryable.Provider
{
get
{
return _provider ?? (_provider = new DbQueryProvider(
GetInternalQueryWithCheck("IQueryable.Provider").InternalContext,
GetInternalQueryWithCheck("IQueryable.Provider").ObjectQueryProvider));
}
}
где время потребляется. Но это странно, поскольку для отладки требуется только время. Я что-то пропустил?
Изменить: Найдено больше информации, связанной с вопросом:
Используя Process Monitor (Sysinternals), я узнал, что существует его процесс desenv.exe, который потребляет массу времени. Чтобы быть более конкретным, это время его потребления с помощью "Thread Exit". Он повторяет стек потока выхода 36 раз. Я не знаю, действительно ли эта информация очень полезна, но я сохранил ".cvs" со стеком, вот его тело: [...] (отредактируйте: удалил тело ".cvs", я могу опубликовать его снова по комментариям, если кто-то действительно подумает, что это будет полезно, но оно было путаным и слишком большим.)
Изменить: установлен VS2013 Ultimate и Entity Framework 6 RTM. Установил бета-версию 4 Power Tools платформы Entity Framework и использовал ее для создания представлений. Ничего не изменилось... Если я запустил exe, это займет 20 секунд, если я начну отлаживать, это займет 120 секунд.
Изменить: Создал небольшой проект для моделирования ошибки: http://sdrv.ms/16pH9Vm
Просто запустите проект внутри среды и непосредственно через .exe, нажмите кнопку и сравните время загрузки.
Ответы
Ответ 1
Это известная проблема с производительностью в Lazy (которую использует EF) при подключении отладчика. В настоящее время мы работаем над исправлением (текущий подход, на который мы смотрим, устраняет использование Lazy). Мы надеемся скоро отправить это исправление в выпуск исправлений. Вы можете отслеживать ход этой проблемы на нашем сайте CodePlex - http://entityframework.codeplex.com/workitem/1778.
Подробнее о предстоящем выпуске патча 6.0.2, который будет содержать исправление, здесь - http://blogs.msdn.com/b/adonet/archive/2013/10/31/ef6-performance-issues.aspx
Ответ 2
Я не знаю, нашли ли вы решение. Но в моем случае у меня была аналогичная проблема, которая впустую пропустила меня примерно через неделю после того, как я попробовал разные предложения. Наконец, я нашел решение, изменив свой web.config на optimizeCompilations = "true", и производительность резко улучшилась с 15-30 секунд до 2 секунд.