2012-09-25 10 views
20

Mój współpracownik opublikował to pytanie wczoraj: 7-second EF startup time even for tiny DbContext.Entity Framework spinup znacznie wolniej na x64 vs x86

Po pobraniu kodu i przeniesieniu go do osobnego rozwiązania w celu wyizolowania go w jak największym stopniu, stwierdziłem, że cel platformy zawierającego projekt wywarł głęboki wpływ na środowisko uruchomieniowe procesu uruchamiania EF.

Podczas kierowania na x64, zobaczyłem, że test trwał ~ 7 sekund, aby zakręcić pierwszy DbContext i < 1 sekundę, aby zakręcić drugi DbContext (zgodny z ustaleniami mojego współpracownika, który jest również ukierunkowany na x64). Jednak po przełączeniu celu platformy na x86, pierwszy czas rozpędzania DbContext został skrócony o około 4 sekundy do 3.34633 sekundy, podczas gdy drugi DbContext zajmował tyle samo czasu co w przypadku x64.

W związku z tym wygląda na to, że struktura Entity Framework przechodzi znacznie odmienny proces inicjowania w przypadku systemu 64-bitowego w porównaniu z systemem 32-bitowym. Czy ktokolwiek ma jakiś wgląd w to, co dzieje się pod maską, aby to wyjaśnić?

+0

Czy to może być sondowanie zespołu? Możesz spojrzeć na Fusion Log, by to sprawdzić. –

+0

@CraigStuntz Sprawdziłem logi fuzji i nie widziałem niczego, co pojawiłoby się inaczej w x86 vs x64. – Sidawy

+1

To jest interesujące. FYI EF nie ma żadnego kodu specyficznego dla architektury 32- lub 64-bitowej - to czysta IL. Jednak różnica jest ogromna. – Pawel

Odpowiedz

11

Kwestia jest w pełni powtarzalna. Właśnie uruchomiłem go i użyłem profilera wydajności dotTrace do zbierania migawek zarówno dla wersji x86, jak i x64. Zdarzyło mi się to w większości przypadków, gdy raportujesz. Ale naprawdę nie ma wyraźnej różnicy między śladami x64 i x86 - z wyjątkiem tego, że x64 ma co najmniej dwukrotnie więcej czasu niż x86 wszędzie.

Ale to było śledzenie testu NUnit. Przez uruchomienie tego samego testu, tak jak w przypadku aplikacji konsolowych, otrzymuję takie dane:

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

To wygląda o wiele lepiej, prawda? Wciąż jest różnica między x86 i x64, ale kod x64 może być ogólnie wolniejszy dla niektórych operacji.

Problem w tym miejscu nie dotyczy EF, ale NUnit i jego biegacza testowego.

Edytuj:

Zrobiłem więcej testów. Zarówno biegacz zadań NUnit, jak i Resharper ma ten problem, ale dotyczy tylko pierwszego testu. Wszystkie inne testy przebiegają szybko. xUnit pokazuje to samo zachowanie.

+2

Ty wiesz, co mówią ..."podwoić ilość bitów, podwoić zabawę!" Zaczekaj. To nie tak. – BoltClock

+0

Bardzo interesujące. Uruchomiłem ten sam zestaw śladów i widziałem to samo zachowanie. Nasuwa się pytanie, dlaczego interakcja między runicznym Nunitem a EF skutkuje zwiększonym czasem wykonywania w x64. – Sidawy