2012-09-25 15 views
20

Il mio collega ha postato questa domanda ieri: 7-second EF startup time even for tiny DbContext.Entity Framework spinup molto più lento su x64 vs x86

Dopo aver preso il suo codice e spostato in una soluzione separata per isolarlo il più possibile, ho scoperto che il target della piattaforma del progetto contenente ha avuto un profondo impatto sul runtime del processo di avvio EF.

Quando ci si rivolge a 64, ho visto che il test ha preso ~ 7 secondi per far girare la prima DbContext e < 1 secondo per girare la seconda DbContext (in linea con i risultati del mio collega che è anche di mira x64). Tuttavia, quando ho cambiato il target della piattaforma su x86, il primo tempo di rotazione di DbContext è stato ridotto di circa 4 secondi fino a 3,334633 secondi, mentre il secondo DbContext ha richiesto lo stesso tempo del caso x64.

Dato questo, Entity Framework sta attraversando un processo di inizializzazione molto diverso quando si mira a un sistema 64-bit vs un sistema a 32 bit. Qualcuno ha qualche idea di ciò che sta succedendo sotto il cofano per spiegare questo?

+0

È forse il sondaggio di assemblaggio? Puoi guardare Fusion Log come un rapido controllo. –

+0

@CraigStuntz Ho controllato i log di fusione e non ho visto nulla che si presentasse in modo diverso in x86 vs x64. – Sidawy

+1

Questo è interessante. FYI EF non ha alcun codice specifico per l'architettura a 32 o 64 bit, è puro IL. Comunque la differenza è enorme. – Pawel

risposta

11

Il problema è completamente riproducibile. Ho appena eseguito e utilizzato dotTrace Performance profiler per raccogliere istantanee per entrambe le esecuzioni x86 e x64. Ho avuto la maggior parte delle volte le tue segnalazioni. Ma non c'è davvero nessuna differenza evidente tra le tracce x64 e x86 - eccetto x64 che richiede almeno il doppio del tempo di x86 ovunque.

Ma quello era il tracciamento del ciclo di prova NUnit. Eseguendo lo stesso test come applicazioni console che ricevo momenti come questo:

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

Che sembra molto meglio, non è vero? C'è ancora differenza tra x86 e x64 ma il codice x64 può essere più lento in generale per alcune operazioni.

Il problema a questo punto non riguarda EF, ma NUnit e il suo test runner.

Edit:

ho fatto un po 'di test. Il task run di NUnit e Resharper ha questo problema ma riguarda solo il primo test. Tutti gli altri test vengono eseguiti rapidamente. xUnit mostra lo stesso comportamento.

+2

You sapere cosa dicono ..."raddoppia i bit, raddoppia il divertimento!" Oh aspetta. Non è giusto. – BoltClock

+0

Molto interessante. Ho eseguito la stessa serie di tracce e ho visto lo stesso comportamento. Si pone la domanda perché l'interazione tra il runner Nunit e EF si traduce in un aumento del tempo di esecuzione in x64. – Sidawy

Problemi correlati