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.

In Pocket speichern vorlesen Druckansicht 3 Kommentare lesen

(Bild: Daniel Tadevosyan/Shutterstock.com)

Lesezeit: 2 Min.
Von
  • Dr. Holger Schwichtenberg

Der vorherige Teil der Serie hat den in .NET 7.0 eingeführte Native-AOT-Compiler für Konsolenanwendungen vorgestellt.

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

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).

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.

Der AOT-Compiler gewinnt klar beim Festplatten- und RAM-Bedarf, verliert aber in seiner Standardeinstellung ebenso deutlich bei einer mathematischen Berechnung (Abb. 1).

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.

Native-AOT-Compiler mit Geschwindigkeitsoptimierung (Abb. 2)

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.

Native-AOT-Compiler mit Größenoptimierung (Abb. 3)

(rme)