2015-11-11 2 views
5

Sind Ngen und RyuJIT zwei völlig unabhängige Dinge unter .NET 4.6 (vor allem mit verschiedenen Optimierungstechniken und Algorithmen)?Ngen vs RyuJIT - schnellster x64 running code wenn (Vor-) Start keine Rolle spielt

Was produziert den schnellsten (besser optimierten) x64-Native-Code, wenn uns die Kosten für Jitting selbst und/oder Kalt-/Warmstartzeit egal sind?

Wir betreiben eine lange laufende Server-App. Die Dauerlaufphase ist sehr leistungsmäßig wichtig. Die (Vor-) Startphase ist für uns unwichtig. Bis jetzt waren wir auf .NET 4.5 und erzeugten immer native Bilder von Ngen. Wir sind gerade dabei, auf .NET 4.6 zu aktualisieren, und wir möchten sicher sein, dass dies die Leistung unserer Dauerlaufphase nicht verschlechtert. Ich habe einige Informationen gelesen, dass RyuJIT eine gute Wahl zur Verbesserung der JIT-Zeit ist, aber dass der Jited-Code im Vergleich zu Ngen weniger optimiert sein kann - siehe z.B. this github comment on one of the RyuJIT bugs.

Antwort

10

Es gibt nicht genug Unterschied zwischen NGen und RyuJIT, um Sie glücklich zu machen. Sie tun sehr verschiedene Jobs, NGen Jits vor-und RyuJIT jits in-time, während der Prozess läuft. Aber NGen hat keinen eigenen Jitter, es fordert RyuJIT auf, den Job zu erledigen. Der generierte Maschinencode unterscheidet sich nicht grundsätzlich. Es gibt einige Optimierungen, die nicht im Voraus durchgeführt werden können, der NGen-Code ist etwas langsamer.

Technisch könnte NGen einen besseren Job machen, da der Optimierer mehr Zeit damit verbringen könnte, den Code zu analysieren und die bestmögliche Optimierung zu finden. Aber Microsoft nutzt das nicht aus. Es ist nicht komplett kristallklar, warum sie nicht haben, aber sicherlich etwas mit ihrer 1-800 Support-Telefonnummer zu tun hat. Code-Optimierung ist immer der riskanteste Teil eines Code-Generators und die Fehler in den bestehenden Jitter waren immer Optimierungsfehler. Dass sich das irgendwann ändern könnte, ist nicht undenkbar.

Sie wären voraus, wenn Sie .NET Native nutzen könnten. Es generiert Code im Voraus mit dem Back-End des C++ - Compilers. Aber derzeit, und sicherlich für eine ganze Weile, wird es nur für gepackte Apps unterstützt. Die Art, die über den Windows Store bereitgestellt wird, muss auf Store, Phone oder Universal ausgerichtet sein und den Store als Einsatzmedium verwenden. Das Paket ist sehr wichtig, um .NET Native arbeiten zu lassen, nur anständige Weise, dass es sehen kann, welcher Code übersetzt werden muss. Und es braucht oft noch Hilfe, um es richtig zu machen. Reflection ist ein schwer zu lösendes Problem, weil Sie es auf Ihrem Rechner haben. Beachten Sie, dass das gleiche Problem nicht für NGen existiert, es beruht immer noch auf dem Jitter, um Code rechtzeitig zu bekommen. Wie Reflection Zielcode und Generika. Dass sich das irgendwann ändern könnte, ist nicht undenkbar.

Wie bereits erwähnt, ist der NGen-Code etwas langsamer. Wenn Sie sich also nicht für Warmstart-Verzögerungen interessieren, möchten Sie NGen nicht verwenden.

Nicht zuletzt erzeugt RyuJIT nicht schneller Code als sein Vorgänger generieren. Was schon sehr gute Arbeit geleistet hat. Zu anständig. Das RyuJIT-Projekt wurde gestartet, um Probleme mit dem alten x64-Jitter zu beheben, die in der Codebasis ziemlich grundlegend waren und nur mit einer drastischen Neuschreibung gelöst werden konnten. Die Optimierung war einer von ihnen, sie hatte keine Obergrenze für die Zeit, die sie dafür ausgegeben hat. Geben Sie es sehr unvernünftig jitting Zeiten auf großen Methoden. Also, wenn Sie die letzte Unze quetschen wollen, dann RyuJIT absichtlich zu deaktivieren, damit es auf den alten x64-Jitter zurückfällt, sollten Sie es versuchen.

+0

Hans, Sie loben die Code-Qualität der .NET JITs bricht mein Herz. – usr

+0

@Hans Passant Vielen Dank für eine sehr detaillierte Antwort! 'NGen-ed Code ist etwas langsamer.' - Sie meinen nur die Startphase (wegen zusätzlicher Dateien auf der Festplatte, die gefunden und in den Speicher geladen werden müssen) oder gibt es andere Gründe?Leider haben wir einige kritische Codewege (Auftragsversand), die auch bei der ersten Ausführung schnell ausgeführt werden müssen (JIT-Profil ist vielleicht der Weg - aber Ngen ist immer noch viel zuverlässiger) – Jan

+0

@usr - Sie lesen meine Posts mit graue farbige Gläser. Loben?? Ich habe .NET Native nicht übersprungen. –

Verwandte Themen