2015-11-11 69 views
5

Czy Ngen i RyuJIT są dwiema zupełnie niezwiązanymi ze sobą rzeczami w .NET 4.6 (szczególnie z różnymi technikami i algorytmami optymalizacji)?Ngen vs RyuJIT - najszybszy x64 z uruchomionym kodem, gdy (wstępne) uruchamianie nie ma znaczenia

Co daje najszybszy (lepiej zoptymalizowany) kod natywny x64, jeśli nie zależy nam na kosztach samego jitowania i/lub zimnym/gorącym czasie rozruchu?

Używamy długiej aplikacji na serwerze. Faza ciągłego działania jest bardzo ważna pod względem wydajności. Faza (wstępna) rozruchu nie ma dla nas znaczenia. Do tej pory byliśmy na .NET 4.5 i zawsze generowaliśmy natywne obrazy Ngen. Jesteśmy w trakcie aktualizacji do .NET 4.6 i chcemy mieć pewność, że nie obniży to wydajności naszej ciągłej fazy działania. Przeczytałem kilka informacji, że RyuJIT jest świetnym wyborem dla poprawy czasu JITing, ale że skręcony kod może być mniej zoptymalizowany w porównaniu do Ngen - patrz np. this github comment on one of the RyuJIT bugs.

Odpowiedz

10

Nie ma wystarczającej różnicy między NGen i RyuJIT, aby cię uszczęśliwić. Wykonują różne zadania, NGen jits z wyprzedzeniem, a RyuJIT w czasie, gdy proces jest uruchomiony. Ale NGen nie ma własnego jittera, prosi RyuJIT o wykonanie zadania. Wygenerowany kod maszynowy nie jest zasadniczo inny. Istnieje kilka optymalizacji, których nie można wykonać z góry, kod NGen-ed jest nieco wolniejszy.

Technicznie NGen mógłby wykonać lepszą pracę, ponieważ optymalizator mógłby poświęcić więcej czasu na analizę kodu i próbę znalezienia optymalnej optymalizacji. Ale Microsoft nie wykorzystuje tego. To nie jest całkowicie kryształowe, dlaczego nie, ale na pewno ma coś wspólnego z ich numerem telefonu wsparcia 1-800. Optymalizacja kodu jest zawsze najbardziej ryzykowną częścią generatora kodu, a błędy w istniejących fluktuacjach zawsze były błędami optymalizacyjnymi. To, że może się to zmienić pewnego dnia, nie jest nie do pomyślenia.

Będziesz wyprzedzać, gdy będziesz mógł skorzystać z .NET Native. Generuje kod z wyprzedzeniem na zapleczu kompilatora C++. Ale obecnie, i na pewno przez dość długi czas, jest on obsługiwany tylko w przypadku aplikacji pakowanych. Takie, które są dostarczane za pośrednictwem Sklepu Windows, musisz kierować reklamy na Sklep, Telefon lub Universal i używać Sklepu jako pojazdu wdrożeniowego. Pakiet jest bardzo ważny, aby uczynić z Native pracy .NET, tylko przyzwoity sposób, aby zobaczyć, jaki kod musi być przetłumaczony. I często nadal potrzebuje pomocy, aby to naprawić, Refleksja to trudny problem do rozwiązania, dlatego, że masz go na swojej maszynie. Zauważ, że ten sam problem nie istnieje dla NGen, nadal polega na jitterze, aby uzyskać jakiś kodowany w czasie. Podobnie jak kod celu Reflection i generics. To, że może się to zmienić pewnego dnia, nie jest nie do pomyślenia.

Jak już wspomniano, kod NGen jest nieznacznie wolniejszy. Więc jeśli nie zależy Ci na opóźnieniach w fazie gorącego startu, nie chcesz używać NGen.

Last but not least, RyuJIT ma nie generuje szybszy kod niż jego poprzednik. Który już zrobił bardzo przyzwoitą robotę optymalizacji. Zbyt przyzwoite. Rozpoczęto projekt RyuJIT, aby naprawić problemy z jittera z x64, które były dość podstawowe w kodzie źródłowym i można je było rozwiązać tylko przy drastycznym przepisywaniu. Optymalizacja była jedną z nich, nie miała górnej granicy czasu, który na nią spędził. Daje to bardzo nierozsądne czasy bigowania na dużych metodach. Więc jeśli chcesz wycisnąć ostatnią uncję, celowo wyłączając RyuJIT, tak aby powrócił do starszej wersji jittera x64, powinieneś spróbować.

+0

Hans, chwaląc jakość kodu .NET JITs łamie mi serce. – usr

+0

@Hans Passant Dziękujemy za bardzo szczegółową odpowiedź! "Uzupełniony kod jest nieco wolniejszy." - masz na myśli tylko fazę uruchamiania (z powodu dodatkowych plików na dysku, które trzeba znaleźć i załadować do pamięci) lub są inne powody?Niestety mamy kilka krytycznych ścieżek kodu (wysyłanie zleceń), które muszą wykonać szybkie, nawet pierwsze wykonanie (profil JIT może być drogą do wyjścia - ale Ngen jest jeszcze bardziej niezawodny) – Jan

+0

@usr - czytasz moje posty z okulary w szarym kolorze. Pochwała?? Nie pominąłem .NET Native. –

Powiązane problemy