Die CLR und JVM haben Ziele und Philosophien, die sich mehr unterscheiden, als Sie vielleicht denken. Im Allgemeinen zielt die JVM darauf ab, dynamischeren Code auf höherer Ebene zu optimieren, während die CLR mehr Low-Level-Tools zur Verfügung stellt, um diese Art von Optimierungen selbst durchzuführen.
Ein gutes Beispiel ist die Stapelzuweisung. Auf der CLR haben Sie eine explizite Stapelzuordnung von benutzerdefinierten Werttypen. Auf der JVM sind die einzigen benutzerdefinierten Typen Referenztypen, aber die JVM kann mithilfe von Escape Analysis unter bestimmten Umständen Heap-Zuordnungen zu Stack-Zuordnungen konvertieren.
Ein anderes Beispiel. In Java sind Methoden standardmäßig virtuell. Zumindest auf C# nicht. Es ist viel schwieriger, virtuelle Methodenaufrufe zu optimieren, da der Code, der an einer bestimmten Aufrufstelle ausgeführt wird, nicht statisch ermittelt werden kann.
Unter der Haube sind ihre Ausführungssysteme ziemlich unterschiedlich. Die meisten JVMs (insbesondere Hotspot) beginnen mit einem Bytecode-Interpreter und nur mit JIT kompilieren Teile des Codes, die z. enge Schleifen. Sie können diese auch jedes Mal neu kompilieren, indem sie Ausführungsstatistiken verwenden, die bei früheren Läufen gesammelt wurden, um Optimierungen zu steuern. Dies ermöglicht mehr Optimierungsaufwand für die Teile des Programms, die es am meisten benötigen. Dies wird adaptive Optimierung genannt.
Die CLR kompiliert alles nur einmal im Voraus. Es führt weniger Optimierungen durch, da es mehr Code zum Kompilieren hat und daher schnell sein muss und weil es keine Statistiken über die tatsächlichen Ausführungspfade enthält, die für die Optimierung verwendet werden. Dieser Ansatz bietet den entscheidenden Vorteil, dass Sie die Ergebnisse der Kompilierung zwischen den Prozessen zwischenspeichern können, was CLR, aber JVM nicht tut. Ein großer Prozentsatz des Hotspot-JVM-Codes ist diesen adaptiven Optimierungen gewidmet und sie haben Java in den frühen 2000er Jahren in die gleiche Performance wie nativer Code für die meisten allgemeinen Berechnungen gebracht. Sie machen die JVM auch zu einem ansprechenden Ziel für dynamische Sprachen. Ich schließe hier die neueren Entwicklungen der Dynamic Languages Runtime aus und rege dynamisch an, da ich nicht genug über den DLR weiß.
Ich schlage vor, eine neue Frage mit dem Betreff zu beginnen, der Sie am meisten interessiert, indem Sie auf diese Frage verweisen. So kann es jedes Thema tiefer abdecken, wenn es Experten gibt. –