2012-09-25 16 views
20

Mi compañero de trabajo publicó ayer esta pregunta: 7-second EF startup time even for tiny DbContext.Entity Framework gira mucho más lento en x64 vs x86

Después de tomar su código y moverlo a una solución separada para aislarlo tanto como fuera posible, descubrí que el objetivo de la plataforma del proyecto contenedor tenía un efecto profundo en el tiempo de ejecución del proceso de inicio de EF.

Al apuntar a x64, vi que la prueba tardó ~ 7 segundos en girar el primer DbContext y < en 1 segundo para girar el segundo DbContext (consistente con los hallazgos de mi compañero de trabajo que también apuntan a x64). Sin embargo, cuando cambié el objetivo de la plataforma a x86, el primer tiempo de activación del DbContext se redujo en aproximadamente 4 segundos hasta 3.34633 segundos, mientras que el segundo DbContext tomó la misma cantidad de tiempo que el caso x64.

Dado esto, parece que Entity Framework está pasando por un proceso de inicialización muy diferente cuando se dirige a un sistema de 64 bits frente a un sistema de 32 bits. ¿Alguien tiene alguna idea de lo que está pasando bajo el capó para explicar esto?

+0

¿Es acaso una prueba de montaje? Podrías mirar Fusion Log como un control rápido sobre eso. –

+0

@CraigStuntz Revisé los registros de fusión y no vi nada que surgiera de manera diferente en x86 frente a x64. – Sidawy

+1

Esto es interesante. FYI EF no tiene ningún código específico para la arquitectura de 32 o 64 bits, es puro IL. Aún así, la diferencia es enorme. – Pawel

Respuesta

11

El problema es totalmente reproducible. Acabo de ejecutarlo y utilicé el perfilador de rendimiento de puntoTrace para recopilar instantáneas para las ejecuciones x86 y x64. Recibí la mayoría de las veces cuando informaste. Pero en realidad no existe una diferencia obvia entre las trazas x64 y x86, excepto que x64 tarda al menos el doble del tiempo de x86 en todas partes.

Pero eso era el rastreo de la ejecución de prueba de NUnit. Mediante la ejecución de la misma prueba al igual que las aplicaciones de consola que recibo momentos como este:

x86: 0,6864012, 0,0468001 
x64: 1,0608019, 0,0468001 

Eso se ve mucho mejor, ¿no? Todavía hay diferencia entre x86 y x64, pero el código x64 puede ser más lento en general para algunas operaciones.

El problema en este momento no es sobre EF sino sobre NUnit y su corrector de prueba.

Edit:

Hice algunas pruebas más. Tanto el corredor de tareas de NUnit como el de Resharper tienen este problema, pero solo afecta la primera prueba. Todas las demás pruebas se ejecutan rápidamente. xUnit muestra el mismo comportamiento.

+2

Usted saber lo que dicen ..."el doble de bits, el doble de diversión" Oh espera. Eso no está bien. – BoltClock

+0

Muy interesante. Ejecuté el mismo conjunto de rastros y vi el mismo comportamiento. Se plantea la pregunta de por qué la interacción entre el corredor Nunit y EF está dando como resultado un aumento en el tiempo de ejecución en x64. – Sidawy

Cuestiones relacionadas