45 Stimmen

Optimiert die .NET CLR wirklich für den aktuellen Prozessor?

Wenn ich über die Leistung von JIT-gestützten Sprachen wie C# oder Java lese, sagen die Autoren in der Regel, dass sie theoretisch viele nativ kompilierte Anwendungen übertreffen sollten/könnten. Die Theorie ist, dass native Anwendungen in der Regel nur für eine Prozessorfamilie (z. B. x86) kompiliert werden, so dass der Compiler bestimmte Optimierungen nicht vornehmen kann, da sie möglicherweise nicht auf allen Prozessoren wirklich optimiert werden. Auf der anderen Seite kann die CLR während des JIT-Prozesses prozessorspezifische Optimierungen vornehmen.

Weiß jemand, ob die CLR von Microsoft (oder Mono) tatsächlich prozessorspezifische Optimierungen während des JIT-Prozesses durchführt? Wenn ja, welche Art von Optimierungen?

0 Stimmen

Soweit ich weiß, im Moment nicht wirklich.

1 Stimmen

Ein Verschwörungstheoretiker könnte auch darüber nachdenken, ob MS das JIT so programmieren könnte, dass es eine De-Optimierung vornimmt, wenn die Software unter einem System eines Konkurrenten läuft, z. B. virtualisiert auf einem x86-Mac, vorausgesetzt, sie könnten erkennen, dass es sich um einen Mac handelt.

8 Stimmen

@aaronls: MacBU bringt Microsoft schätzungsweise 350 Millionen Dollar pro Jahr an Einnahmen ein. Macs sind ein Profit-Center für Microsoft, den weltweit größten Anbieter von Mac-Software außerhalb von Apple selbst. Wie passen diese Fakten zu Ihrer Verschwörungstheorie?

28voto

Sam Harwell Punkte 94511

Bereits 2005 hat David Notario in seinem Blog-Eintrag "" mehrere gezielte Optimierungen aufgelistet. Nutzt das JIT meine CPU aus? ". Ich kann nichts über die neue CLR 4 finden, aber ich nehme an, dass mehrere neue Elemente enthalten sind.

4 Stimmen

Wow! Das ist ein schöner Fund. +1

0 Stimmen

Zitat aus dem Blog: "Wir vektorisieren den Code nicht (was der eigentliche Vorteil von SSE2 ist)". So leider, JIT nimmt nicht viel Vorteile.

0 Stimmen

@colinfang, aber das wird es bald: blogs.msdn.com/b/dotnet/archive/2014/04/07/

8voto

mmx Punkte 400975

Eine prozessorspezifische Optimierung, von der ich weiß, dass sie in Mono durchgeführt wird, ist das Kompilieren von Mono.Simd ruft auf. bis hin zu SSE-Befehlen auf Prozessoren, die SSE unterstützen. Wenn der Prozessor, auf dem der Code ausgeführt wird, SSE nicht unterstützt, gibt der JIT-Compiler den entsprechenden Nicht-SSE-Code aus.

2voto

Henk Holterman Punkte 249753

Die 32- und 64-Bit Jitters sind unterschiedlich, das ist ein Anfang.

0 Stimmen

So wie ich die Frage verstehe, sucht der OP nach prozessorspezifischen Optimierungen innerhalb einer Prozessorfamilie (z. B. generiert es spezifischen Code, je nachdem, ob der aktuelle Prozessor auf der NetBurst- oder der Core-Mikroarchitektur basiert, die beide im 32-Bit-Modus laufen)?

0 Stimmen

@Mehrdad, ich weiß, dass dies nicht die Hauptrichtung war, aber ich dachte, es verdiene eine Erwähnung.

2voto

erasmus Punkte 915

Der .Net Framework Runtime Optimization Service optimiert nicht nur die Programmierung (Compiler-Optimierung), sondern auch die Prozessoren.

2voto

kvb Punkte 54045

Ich möchte darauf hinweisen, dass der Hauptgrund, der für das Potenzial von JIT-kompilierten Sprachen angeführt wird, statisch kompilierte Sprachen zu übertreffen, nichts mit prozessorspezifischen Anweisungen zu tun hat. Vielmehr können Informationen über den dynamischen Zustand des Programms genutzt werden, um Codepfade zu optimieren. Zum Beispiel, Inline-Caching kann verwendet werden, um virtuelle Methodenaufrufe ungefähr so schnell wie nicht-virtuelle Methodenaufrufe zu machen. Grob gesagt funktioniert dies durch die Annahme, dass die Methode an einer bestimmten Aufrufstelle nur für einen einzigen Typ aufgerufen wird, und durch die Ausgabe von Code, der direkt zu dieser Implementierung springt (und dann den Code neu schreibt, wenn sich diese Annahme später nicht bestätigt).

0 Stimmen

Führt Microsofts CLR Inline-Caching durch?

0 Stimmen

@dewald - Nicht dass ich wüsste, aber ich glaube, dass mehrere Java VMs dies tun. Da Methoden in C# (im Gegensatz zu Java) nicht standardmäßig virtuell sind, denke ich, dass dies eine geringere Priorität für .NET war. Dies ist jedoch nur ein Beispiel dafür, wie ein JIT zur Laufzeit Optimierungen vornehmen kann, die statisch nur schwer oder gar nicht möglich sind.

2 Stimmen

@dewald - Siehe stackoverflow.com/questions/1255803/ für weitere Informationen über den Unterschied zwischen CLR- und JVM-Ansätzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X