2013-12-13 1 views
4

С моей интеграционного теста:Шесть секунд прогрева для первой структуры объекта 6 nonquery

// Act 
Stopwatch w = new Stopwatch(); 
w.Start(); 
userService.Create(userDTO); 
w.Stop(); 


public void Create(UserDTO userDTO) 
{ 
    var user = userDTO.ToEntity(); 
    _context.Entry(user).State = EntityState.Added; 
    _context.SaveChanges(); 
} 

6,2 секунды, чтобы сделать «SQL вставки» является сумасшедшим. Я уже вижу, что пользователи приложений жалуются, когда они впервые открывают проект, который они используют целый год. Поэтому каждый день они должны ждать 6 секунд ...

Я думал, что время прогрева в EF6 улучшилось?

Есть ли что-нибудь, что я могу сделать, чтобы улучшить это жалкое поведение?

+1

Можете ли вы добавить результаты SQL Profiler? –

+0

Нет, я не могу. Сожалею. – Pascal

ответ

2

Пробег: EF6 CodeFirst View Generation T4 Template for C#. Предварительно созданные представления улучшают время запуска приложений, перемещая работу, которая должна быть выполнена во время выполнения, для разработки времени. more info

+0

Если бы я по-прежнему использовал EF, ваш совет помог бы не больше. Но я не спускаю этот маршрут ... – Pascal

+0

@Pascal - для 5 сущностей он не должен Разница (Кстати, я написал этот шаблон). Что-то еще должно происходить там. – Pawel

5

Время не предназначено для вставки простых данных. EF создает модель в памяти, то есть время, в которое вы потратили время.

EF создает модель данных сущности и выполняет просмотр представлений (не db-представлений) в первый раз, когда вы выполняете операцию в контексте. Посмотрите на this blog post.

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

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

using (var context = new MyContext()) 
{ 
    context.Database.Initialize(false); 
} 
+0

В какой модели вы говорите? Пользовательский объект? nah ... – Pascal

+0

См. мой обновленный ответ. –

+0

Я использую структуру DI, чтобы внедрять и контролировать время жизни MyContext для каждого запроса HTTP. Таким образом, я не могу использовать ваш асинхронный совет, он просто не подходит. Согласно моему сценарию, теперь я правильно понимаю, что каждый раз, когда мой инструмент DI создает контекст для каждого запроса HTTP, я должен ждать 6 секунд? Предположим, что я не использую скомпилированные запросы, потому что мой первый оператор является вставкой/обновлением ... – Pascal

0

Вы пробовали EF 6.0.2? Он затрагивает несколько проблем производительности и может помочь. Найдите более подробную информацию (включая список исправленных ошибок в этом выпуске) here

+0

Я запускаю 6.0.2 здесь и не меняю. – Pascal

+0

Насколько велика ваша модель? Пробовали ли вы использовать приложение на EF5, чтобы сравнить запуск Если у вас стабильный реестр, вы можете создать ошибку на https: //entityframework.codeplex.com/WorkItem/Create - обязательно прикрепите репродукцию. – Pawel

+0

5 объектов. Есть много проблем/неудобных вещей, которые я испытываю с моими личными требованиями с EF в целом, что я переключился на ormlite servicestack после оценки EF/dapper/ormlite :-) – Pascal

3

Ngen сократит это пополам. Entity Framework не компилируется изначально. У меня есть скрипт, который компилирует все в выходной каталог. Делает большую разницу даже при отладке.

@ECHO OFF 
    REM ********************************************************************************************************* 
    REM Compiles project's .net assemblies to native images to improve startup time and overall performance 
    REM --------------------------------------------------------------------------------------------------------- 
    REM Author: Brian Freeman 
    REM History: 
    REM  12/2/2013 Created 
    REM ********************************************************************************************************* 
    REM Scenarios: 
    REM  /Debug   - Generate images that can be used under a debugger 
    REM  /Profile  - Generate images that can be used under a profiler 
    REM  /NoDependencies - Generate the minimal number of native images 
    REM      required by this scenario 
    REM Options 
    REM  /verbose 

    SET DEFAULTOPTIONS= /Debug /Verbose 

    @ECHO. ------------------------------------- 
    @ECHO. Native Image Generator (Ngen.exe) 
    @ECHO. ------------------------------------- 
    @ECHO Current Defaults are %DEFAULTOPTIONS% 


    REM --------------------------------------------------------------------- 
    REM Small chance these might not be the locations of the .net framework 
    REM Needs to be added to as the framework gets new versions 
    REM --------------------------------------------------------------------- 
    SET ngenx86=C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe 
    SET ngenx64=C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe 

    REM Run from the current Directory to ensure any dependencies are available 
    pushd ..\DatabaseHelper\Bin\Debug 

    REM SKIP vshost.exe 
    ATTRIB +S ..\*.vshost.exe /s 

    @ECHO. ------------------------------------- 
    @ECHO. Generator x64 Images 
    @ECHO. ------------------------------------- 

    for /f "delims=" %%f in ('dir *.dll /b /s /a-d-h-s') do %ngenx64% install "%%f" %* %DEFAULTOPTIONS% 
    for /f "delims=" %%f in ('dir *.exe /b /s /a-d-h-s') do %ngenx64% install "%%f" %* %DEFAULTOPTIONS% 

    @ECHO. ------------------------------------- 
    @ECHO. Generator x86 Images 
    @ECHO. ------------------------------------- 

    for /f "delims=" %%f in ('dir *.dll /b /s /a-d-h-s') do %ngenx86% install "%%f" %* %DEFAULTOPTIONS% 
    for /f "delims=" %%f in ('dir *.exe /b /s /a-d-h-s') do %ngenx86% install "%%f" %* %DEFAULTOPTIONS% 
    @ECHO OFF 

    ATTRIB -S ..\*.vshost.exe /s 

    popd 


    @ECHO. --------------------- 
    @ECHO. FINISHED 
    @ECHO. ---------------------