2015-05-09 21 views
7

Stworzyłem popularny program WinForm w języku C#, który ma wiele widżetów GUI, i odkryłem, że gdy celem platformy jest x64, uruchomienie jest około 5-10 razy wolniejsze niż x86. Pod celem x64 uruchomienie systemu zajmuje około 5 sekund, co negatywnie wpływa na wygodę użytkownika. Chciałbym zrobić to szybciej.Uruchomienie programu WinForm 10x wolniej pod x64 względem x86

Próbowałem również z innym programem, a także czas uruchamiania pod x64 był podwójny lub potrójny od x86.

Więc zacząłem się zastanawiać, co było przyczyną. Moje programy używają sporej ilości widżetów, więc aby przetestować teorię, postanowiłem stworzyć projekt testowy z 800 przyciskami! Ustawiłem je wszystkie na Visible=False, aby prędkość odświeżania/odświeżania nie zabłagała wody.

Sample form with 800 buttons

Ku memu zdumieniu 64 rozpoczęła się o wiele wolniej niż równowartość x86. Następnie przejrzałem sekcję InitializeComponent(); i na pewno wersja x64 działała około 3,5 sekundy. Z drugiej strony x86 zajęło tylko około 0.275 sekund. To prawie 13 razy szybciej!

.NET Framework 2.0, 3.0 i 3.5 są równie złe. Kierowanie .NET 4 & 4.5 pod x64 jest znacznie lepsza około 0,8 sekundy, ale nadal jest około 3 razy wolniejsza (x86 jest tak dobra na 0,28 sekundy), a ja chcę używać .NET 3.5 dla zwiększonej bazy użytkowników.

Moje pytanie brzmi: co powoduje, że wersja x64 uruchamia się tak wolno i jak mogę ją przyspieszyć, aby była porównywalna z wersją x86?

Jeśli ktoś chce natychmiast sprawdzić, jakie stworzył zip z projektu VS 2010, który można pobrać tutaj: http://www.skytopia.com/stuff/64_vs_32bit_Startup_Speed.zip

+1

Jedną z różnic wydajności między 32 a 64 bitami jest to, że 64 JITter potrzebuje więcej czasu na kompilację (ale daje lepszy kod). Uważam jednak za bardzo mało prawdopodobne, że twój kod jest ograniczony przez wydajność JIT, więc nie powinno to być przyczyną problemu z wydajnością. Nowy RyuJIT poprawia 64-bitowy czas JIT, ale produkuje gorszy kod niż obecny 64-bitowy JITter. – CodesInChaos

+0

@CodesInChaos: Interesujące. Jestem zdeterminowany, aby dojść do sedna tego. Jest bardzo powtarzalny i ma duży wpływ na tak wielu użytkowników i programistów. –

+0

Kierowanie .net 4.5 zamiast 3.5 poprawia wydajność z 2,0 do 1,3 na moim komputerze. – CodesInChaos

Odpowiedz

6

Jest to koszt JIT swojego 10.000 linii InitializeComponent funkcji.

  • Jeśli mierzyć czas między wywołaniu InitializeComponent i wykonania jej pierwszej linii, to większość kosztów. (Wystarczy wstawić linię na górze InitializeComponent do pomiaru).

  • Jeśli używasz VS pracę analizatora, będzie to pokazać najwięcej czasu spędzanego w ThePreStub, co jest związane z JIT.

  • JITter 64-bitowy potrzebuje więcej czasu na kompilację kodu niż JITter 32-bitowy, ale w zamian daje lepszy kod.

    Firma Microsoft pracuje nad nową wersją oprogramowania JITter o nazwie RyuJIT. Pochodzi z 32 bitowego JITtera i ma podobne cechy (szybka kompilacja powodująca gorszy kod). Stanie się standardowym JIT w przyszłych wersjach .NET.

  • .NET 4.5 zmniejsza koszt z 2,0 do 1,3 na moim komputerze. Jest to prawdopodobnie spowodowane ulepszeniami JIT w środowisku wykonawczym 4.0.

  • Równoważna pętla to dużo szybciej niż twoja funkcja InitializeComponent.

    To nie pomoże, jeśli chcesz utworzyć wszystkie komponenty w projektancie, ale jeśli masz połączenie powtarzalnych elementów sterujących i komponentów, które chcesz edytować w projektancie, możesz użyć pętli.Po prostu umieść go w Form1.cs nie w Form1.designer.cs, aby nie został nadpisany przez projektanta.

  • Użycie NGen na zespole powinno wyeliminować koszt JIT. Ale przychodzi to z wadą radzenia sobie z GAC.

+0

Możesz także użyć NGen, aby wyeliminować koszt JIT. – Zer0

+0

NGen jest prostym rozwiązaniem, zabiera je od ~ 1400 do ~ 170 ms na mojej maszynie. –

+0

Wszystkie zalety. Ale edytowanie kodu designer.cs bezpośrednio z optymalizacją for/loop jest akademickie, ponieważ powraca, gdy tylko dostosuję coś w edytorze WYSIWYG Design. .NET 4.5 jest rzeczywiście znacznie szybszy, ale myślę, że chcę .NET 3.5 dla większej bazy użytkowników. RyuJIT brzmi świetnie, ale jeszcze nie jest, a NGen ma kompromisy, jak zauważyłeś. Czy jest jakaś jakaś "hack"? –

Powiązane problemy