Leistungsprobleme der SaveXML-Funktion im 64-Bit-Modus

Es ist eine gut dokumentierte Tatsache, dass die System.Xml.dll-Assembly erhebliche Leistungsprobleme beim Ausführen im 64-Bit-Modus aufweist. Dies wird hauptsächlich durch den JIT-Compiler (Just-In-Time) von Microsoft verursacht, wie Microsoft in den folgenden Kommentaren erläutert:

“Die Ursache des Problems hängt mit zwei Dingen zusammen: Erstens hat der x64-JIT-Compiler einige Algorithmen, die quadratisch skalieren. Einer davon ist leider der Debug-Info-Generator. Bei sehr großen Methoden gerät dieser wirklich außer Kontrolle.”

und

“Einige Algorithmen im 64-Bit-JIT haben eine polynomiale Skalierung. Wir arbeiten tatsächlich daran, den 32-Bit-JIT-Compiler auf x64 zu portieren, aber das wird erst bei der nächsten Side-by-Side-Veröffentlichung der Runtime verfügbar sein (wie ‘2.0 & 4.0 laufen Side-by-Side,’ aber 3.0/3.5/3.5SP1 waren ‘in-place’-Veröffentlichungen). Ich habe dies in einen ‘Vorschlag’ umgewandelt, damit ich es an das JIT-Throughput-Arbeitselement anhängen kann, um sicherzustellen, dass dies behoben wird, wenn der neu portierte JIT fertig zum Ausliefern ist.”

Wenn Sie Ihr Projekt als 64-Bit-Anwendung ausführen und auf dieses Problem stoßen, gibt es mehrere Workarounds, um es zu beheben:

  1. Führen Sie Ihre Anwendung als 32-Bit-Anwendung aus
    Die Leistungsprobleme des JIT-Compilers treten ausschließlich in der 64-Bit-Umgebung auf. Durch das Ausführen Ihrer Anwendung im 32-Bit-Modus können Sie diese Probleme vollständig vermeiden.
  2. Erstellen Sie native Images für die Assemblies Ihrer Anwendung
    Dieser Ansatz ist einfach und äußerst effektiv. Verwenden Sie das Tool Ngen.exe (Native Image Generator), um Ihre Assemblies vorab in nativen Maschinencode zu kompilieren. Dies kann die Leistung Ihrer 64-Bit-Anwendung um bis zu das 100-Fache steigern. Führen Sie dazu den folgenden Befehl aus:

    ngen install <path to your application exe>