Heim >Backend-Entwicklung >C++ >Bietet der „as'-Operator bei Nullable-Typen in C# immer Leistungsvorteile gegenüber „is'?

Bietet der „as'-Operator bei Nullable-Typen in C# immer Leistungsvorteile gegenüber „is'?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-07 09:31:40240Durchsuche

Does the

Leistungsüberraschung mit dem „as“-Operator und Nullable-Typen

In Kapitel 4 von C# in Depth werden Nullable-Typen und der „as“-Operator besprochen. Insbesondere besteht die Erwartung, dass die Verwendung von „as“ zur Typprüfung die Leistung gegenüber herkömmlichen „is“-Prüfungen und -Umwandlungen verbessern kann, da dadurch der Prozess auf eine einzige Typprüfung und Wertprüfung vereinfacht wird. Es wurde jedoch ein überraschendes Ergebnis beobachtet.

Leistungs-Benchmark-Test

Um die Leistung zu bewerten, wurde ein Benchmark-Test durchgeführt, bei dem ganze Zahlen innerhalb eines Objektarrays summiert wurden, das zahlreiche Null- und String-Referenzen enthielt . Der Test hat die Ausführungszeit der folgenden Codefragmente gemessen:

  • C# 1-Code mit „is“ und Casting
  • Code mit dem „as“-Operator
  • LINQ Lösung

Zum Erstaunen des Forschers übertraf der C#-1-Code sowohl den „as“-Code als auch den LINQ-Code deutlich.

Analyse der Ergebnisse

Die Leistungsdiskrepanz ist auf folgende Faktoren zurückzuführen:

JIT Compiler-Optimierung für „is“ und Casting:
Der „is“-Operatortest und die anschließende Umwandlung können durch den JIT-Compiler optimiert werden, was zu hocheffizientem Maschinencode führt, der mit einer minimalen Anzahl von Anweisungen ausgeführt wird. Diese Optimierung ist möglich, weil der geboxte Werttyp ohne Wertkonvertierungen oder Kopieren direkt in eine Variable desselben Typs entboxt werden kann.

Komplexität der Konvertierung in Nullable:
Umwandeln in int? Die Verwendung von „as“ erfordert einen komplexeren Konvertierungsprozess, da sich die Wertdarstellung der geschachtelten Ganzzahl vom Speicherlayout von Nullable unterscheidet. Dies erfordert die Einbeziehung einer allgemeinen Unboxing-Hilfsfunktion namens JIT_Unbox_Nullable, die aufgrund ihrer generischen Natur und Typprüfung zusätzlichen Overhead mit sich bringt.

Unerwartetes Verhalten von LINQ:
The OfType ()-Erweiterungsmethode in LINQ verwendet auch den „is“-Operator und die Hilfsfunktion JIT_Unbox(). Allerdings war seine Leistung mit der „as“-Umwandlung in Nullable vergleichbar, trotz der Erwartung, dass es kostengünstiger sein sollte. Diese Diskrepanz könnte auf potenzielle Probleme zurückzuführen sein, die durch ngen.exe verursacht werden.

Fazit

Während der „as“-Operator eine praktische Möglichkeit zur Typprüfung und zur Verarbeitung von Nullable-Werten bietet, sind seine Leistungsmerkmale unten aufgeführt Bestimmte Szenarien entsprechen möglicherweise nicht immer den Erwartungen. Der optimierte Code, der für „ist“ und das Umwandeln in C# 1 generiert wird, bleibt in Fällen mit zahlreichen Unboxing-Vorgängen deutlich schneller, was unterstreicht, wie wichtig es ist, bei der Auswahl von Codierungstechniken Auswirkungen auf die Leistung zu berücksichtigen.

Das obige ist der detaillierte Inhalt vonBietet der „as'-Operator bei Nullable-Typen in C# immer Leistungsvorteile gegenüber „is'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn