Neu in .NET 7.0 [18]: Leistung und Anpassen des Ahead-of-Time-Compilers
Der AOT-Compiler erzeugt ressourcensparende Binaries, aber seine volle Stärke spielt er erst mit den richtigen Einstellungen in der Konfiguration aus.
- Dr. Holger Schwichtenberg
Der vorherige Teil der Serie hat den in .NET 7.0 eingeführte Native-AOT-Compiler für Konsolenanwendungen vorgestellt.
Das Ergebnis der Native-AOT-Kompilierung ist immer eine einzige ausführbare Datei, die alle notwendigen Teile der .NET-Laufzeitumgebung enthält (in der .NET-Fachsprache: self-contained, single File Assembly).
Leitungsvergleich
Abbildung 1 zeigt eine Testanwendung, die einmal per Just-in-Time-Compiler (JIT) und einmal per Native-AOT kompiliert wurde. Die wesentlichen Erkenntnisse aus diesem Vergleich sind:
- Die Laufzeitcodegenerierung mit Reflection Emit und das dynamische Nachladen von Assemblies funktioniert nicht bei AOT.
- Das Deployment-Paket bei AOT ist sehr wesentlich kleiner: 6,65 MByte vs. 65,78 MByte.
- Entsprechend ist der RAM-Bedarf bei Anwendungsstart geringer: 4,97 MByte vs. 8,84 MByte.
- Aber: Die Rechenzeit für eine Zahlenreihe von 42 Millionen Werten dauert bei Native-AOT doppelt so lange: 787 ms vs. 1519 ms.
Geschwindigkeitsoption bei Native-AOT
Die offizielle Dokumentationsseite zu Native-AOT verschweigt, dass es Einstellungen für den AOT-Compiler gibt. Erst beim Wühlen auf GitHub findet man eine weitere Dokumentationsseite mit der Zusatzoption
<IlcOptimizationPreference>Speed</IlcOptimizationPreference>
Damit kommt ein AOT-Kompilat heraus, das nur wenige Kilobyte größer ist, aber die Berechnung mit 612 Millisekunden noch schneller als der Just-in-Time-Compiler ausführt (siehe Abbildung 2). Das Kompilat und der RAM-Bedarf sind nur marginal größer als bei der Standardeinstellung von Native-AOT.
1.1 Größenoptimierung bei Native-AOT
Eine weitere Option bei der Native-AOT-Kompilierung ist
<IlcOptimizationPreference>Size</IlcOptimizationPreference>
Die Größe mit 6,56 MByte (siehe Abbildung 3) ist etwas kleiner als bei der Standard-AOT-Kompilierung (6,65 MByte) und der Geschwindigkeitsoption (6,84 MByte). Die Geschwindigkeit bei der Berechnung ist mit 656 Millisekunden immer noch deutlich besser als bei der Standard-AOT-Kompilierung.
(rme)