ホームページ > バックエンド開発 > C++ > C# の 'as' 演算子が null 許容型の 'is' よりも遅いのはなぜですか?

C# の 'as' 演算子が null 許容型の 'is' よりも遅いのはなぜですか?

DDD
リリース: 2025-01-07 09:22:45
オリジナル
500 人が閲覧しました

Why is the C#

C# の "as" 演算子と Nullable 型による予期しないパフォーマンスの違い

C# の "as" 演算子は、型チェックと動的キャストを行います。 null 許容型で "as" を使用すると、従来の "is" 演算子やキャストよりもパフォーマンスが向上するように思えるかもしれませんが、最近のテストで驚くべき結果が明らかになりました。

オブジェクト配列に混合が含まれるテスト シナリオでは整数、文字列、および null 参照の場合、「as」演算子は「is」演算子に比べてパフォーマンスが大幅に低下します。 "as" 演算子による型チェックと値チェックの組み合わせは、動的型を 2 回クエリするよりも効率的であると考えられていたため、これは予想外でした。

null 許容型に対する "isinst" の .NET 実装を分析すると、次のことが明らかになります。特に遅いわけではないということ。むしろ、この問題は、null 許容型で "as" を使用するときに必要な追加のアンボックス化手順に起因しているようです。

JIT コンパイラーは、"is" 演算子および null 非許容型のキャスト用に高度に最適化されたコードを生成できます。ただし、null 許容型の "as" では、ボックス化解除と Nullable への変換を実行するために、より複雑な JIT ヘルパー関数が必要です。この関数は、"is" 演算子で使用される直接型チェックとキャストよりもオーバーヘッドが高くなります。

"OfType()" とジェネリック型へのキャストを使用する LINQ ソリューションも、よりパフォーマンスが悪くなります。 「is」演算子。これは、Nullable へのキャスト中に呼び出される JIT ヘルパー関数 JIT_Unbox() に起因する可能性があります。

結論として、「as」演算子は便利な構文を提供しますが、必ずしもそうであるとは限りません。 null 許容型を操作するときに最高のパフォーマンスを提供します。パフォーマンスが重要なシナリオでは、「is」演算子を使用し、目的の型に直接キャストすることをお勧めします。

以上がC# の 'as' 演算子が null 許容型の 'is' よりも遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート