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ć.
Hans, chwaląc jakość kodu .NET JITs łamie mi serce. – usr
@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
@usr - czytasz moje posty z okulary w szarym kolorze. Pochwała?? Nie pominąłem .NET Native. –