.Net 7 JSON Performance-Trap
Wir sollten beim Schreiben von Code die Leistung im Auge behalten und gleichzeitig Nano-Optimierungen vermeiden. Was wie eine sparsame Optimierung aussieht, macht manchmal einen großen Unterschied. Heute werden wir sehen, wie System.Text.Json eine Performance-Penalty-Falle hat.
Was ist falsch an diesem Code?
Jedes Mal, wenn wir diese Funktion ausführen, erstellt sie eine neue JsonSerializerOptions. Wie schlimm ist es, jedes Mal ein neues Objekt zu instanziieren? Im Allgemeinen ist das Erstellen eines neuen Objekts in Bezug auf Leistung und Speicherzuweisung vernachlässigbar. Dennoch erhielt mein Team bei der Erstellung eines Leistungsprofils verdächtige Ergebnisse. Die für diese Funktionen benötigte Zeit war gleich:
- SendToServiceBus()
- Serialisieren()
Warum ist Serialisieren so langsam?
Das neue System.Text.Json verwendet die Instanzreferenz von JsonSerializerOptions, um Serialisierungsmetadaten zwischenzuspeichern. Wenn Sie also jedes Mal eine neue Instanz bereitstellen, verlieren Sie die Zwischenspeicherung, und der Code muss die teure Operation zum Erstellen der Metadaten für jede Funktion ausführen Anruf.
Das Problem ist so häufig, dass Microsoft diesem Thema sogar eine ganze Seite gewidmet hat.
Beispiel
Die Dokumentation enthält dieses Benchmark-Beispiel:
Wie Sie den Dokumenten entnehmen können, ist der Unterschied enorm, über 200-mal teurer. Und es gibt nichts, was Sie darüber aufklärt, keine Ausnahme oder Warnung. Sie finden dies nur während des Lasttests und der Profilerstellung. Ich frage mich, ob dies eine Warnung sein sollte, also reduzieren wir die Häufigkeit, mit der dieser Fehler gemacht wird.
Fazit
Gute Praktiken wie das Kennen der Lebenszyklen von Objekten und das Optimieren der Erstellung für Singletons zahlen sich möglicherweise mehr aus als das, wonach sie aussehen. Ich empfehle daher, zu lernen, wann Sie ein Singleton oder ein neues Objekt pro Anfrage möchten.
Denken Sie daran, dass das Erstellen von Serializer-Optionen jedes Mal erhebliche Auswirkungen hat, da das Framework interne Metadaten für die SerializerOptions-Referenz zwischenspeichert.
Wenn Sie ein neues JsonSerializerOptions() sehen, vergewissern Sie sich, dass es sich um ein Singleton-Muster handelt.
Viel Spaß beim Codieren.

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































