EF6 / Code First: Súper lento durante la 1a consulta, pero solo en Debug


Estoy usando EF6 rc1 con la estrategia Code First, sin vistas precompiladas y el problema es: Si compilo y corro la aplicación exe tarda como 15 segundos en ejecutar la primera consulta (eso está bien, ya que todavía estoy trabajando en las vistas pre-generadas). Pero si utilizo Visual Studio 2013 Preview para Depurar exactamente la misma aplicación tarda casi 2 minutos ANTES de ejecutar la primera consulta:

Dim Context = New MyEntities()
Dim Query = From I in Context.Itens '' <--- The debug takes 2 minutes in here
Dim Item = Query.FirstOrDefault()

¿Hay alguna manera de eliminar este tiempo extra? Estoy haciendo algo mal aquí?

Ps.: El contexto en sí no es complicado, solo está lleno con más de 200 tablas.

Edit: Descubrió que el problema es que durante el tiempo de depuración, EF parece estar generando las vistas ignorando las pre-generadas. Usando el código fuente de EF descubrí que la propiedad:

IQueryProvider IQueryable.Provider
    {
        get
        {
            return _provider ?? (_provider = new DbQueryProvider(
                                                 GetInternalQueryWithCheck("IQueryable.Provider").InternalContext,
                                                 GetInternalQueryWithCheck("IQueryable.Provider").ObjectQueryProvider));
        }
    }

Es donde se consume el tiempo. Pero esto es extraño ya que solo toma tiempo en la depuración. Me estoy perdiendo algo aquí?

Editar: Encontrado más información relacionada con la pregunta: Usando el Proceso Monitor (por Sysinternals) Me enteré de que allí es el 'desenv.exe " proceso que está consumiendo toneladas de tiempo. Para ser más específicos, su tiempo consume con una 'Salida de hilo'. Repite la pila de salida del hilo 36 veces. No se si esta información es muy útil, pero guardé un'.cvs ' con la pila, aquí está su cuerpo: [...] (edit: removed the '.el cuerpo de cvs, puedo publicarlo de nuevo por los comentarios si alguien realmente piensa que va a ser útil, pero era confuso y demasiado grande.)

Editar: Instalado VS2013 Ultimate y Entity Framework 6 RTM. Se instaló Entity Framework Power Tools Beta 4 y se utilizó para generar las vistas. Nada cambió... Si corro el exe tarda 20 segundos, si 'Comienzo' la depuración tarda 120 segundos.

Editar: Se creó un pequeño proyecto para simular el error: http://sdrv.ms/16pH9Vm Simplemente ejecute el proyecto dentro del entorno y directamente a través del .exe, haga clic en el botón y compare el tiempo de carga.

Author: Adauto Ramalho, 2013-08-30

2 answers

Este es un problema de rendimiento conocido en Lazy (que EF está utilizando) cuando se adjunta el depurador. Actualmente estamos trabajando en una solución (el enfoque actual que estamos viendo es eliminar el uso de Lazy). Esperamos enviar esta corrección en un lanzamiento de parche pronto. Puede seguir el progreso de este problema en nuestro sitio de CodePlex - http://entityframework.codeplex.com/workitem/1778 .

Más detalles sobre la próxima versión del parche 6.0.2 que incluirá una corrección están aquí - http://blogs.msdn.com/b/adonet/archive/2013/10/31/ef6-performance-issues.aspx

 12
Author: Rowan Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-31 21:14:46

No se si has encontrado la solución. Pero en mi caso, tuve un problema similar que me desperdició cerca de una semana después de probar diferentes sugerencias. Finalmente, encontré una solución cambiando mi web.config to optimizeCompilations= "true" y el rendimiento mejoró drásticamente de 15-30 segundos a aproximadamente 2 segundos.

 -1
Author: Phillip Nguyen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-18 09:56:48