Heim >Backend-Entwicklung >C++ >Warum ist der C#-Operator „as' bei nullfähigen Typen langsamer als „is'?

Warum ist der C#-Operator „as' bei nullfähigen Typen langsamer als „is'?

DDD
DDDOriginal
2025-01-07 09:22:45513Durchsuche

Why is the C#

Unerwartete Leistungsunterschiede mit „as“-Operator und Nullable-Typen in C#

Der „as“-Operator in C# bietet eine praktische Möglichkeit zur Ausführung Typprüfungen und Umwandlungen dynamisch. Während es den Anschein haben mag, dass die Verwendung von „as“ mit nullbaren Typen Leistungsverbesserungen gegenüber dem herkömmlichen „is“-Operator und der Umwandlung bieten würde, haben aktuelle Tests überraschende Ergebnisse ergeben.

In einem Testszenario, in dem ein Objektarray eine Mischung enthält Bei Ganzzahlen, Zeichenfolgen und Nullverweisen weist der „as“-Operator im Vergleich zum „is“-Operator eine deutlich schlechtere Leistung auf. Dies war unerwartet, da man annehmen würde, dass die Kombination aus Typprüfung und Wertprüfung des „as“-Operators effizienter wäre als die zweimalige Abfrage dynamischer Typen.

Die Analyse der .NET-Implementierung von „isinst“ für nullfähige Typen zeigt dass es nicht besonders langsam ist. Stattdessen scheint das Problem auf den zusätzlichen Unboxing-Schritt zurückzuführen zu sein, der erforderlich ist, wenn „as“ mit nullfähigen Typen verwendet wird.

Der JIT-Compiler kann hochoptimierten Code für den „is“-Operator und das Casting für nicht nullbare Typen generieren. Allerdings erfordert „as“ mit Nullable-Typen eine komplexere JIT-Hilfsfunktion, um das Unboxing und die Konvertierung in Nullable durchzuführen. Diese Funktion hat einen höheren Overhead als die direkte Typprüfung und Umwandlung, die im „is“-Operator verwendet wird.

Die LINQ-Lösung, die „OfType()“ und eine Umwandlung in einen generischen Typ verwendet, weist ebenfalls eine schlechtere Leistung auf als der „ist“-Operator. Dies könnte auf die JIT-Hilfsfunktion JIT_Unbox() zurückzuführen sein, die während der Umwandlung in Nullable aufgerufen wird.

Zusammenfassend lässt sich sagen, dass der „as“-Operator zwar eine praktische Syntax bietet, dies jedoch möglicherweise nicht immer der Fall ist bieten die beste Leistung bei der Arbeit mit nullfähigen Typen. In leistungskritischen Szenarien empfiehlt es sich, den „is“-Operator zu verwenden und direkt auf den gewünschten Typ umzuwandeln.

Das obige ist der detaillierte Inhalt vonWarum ist der C#-Operator „as' bei nullfähigen Typen langsamer als „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