ホームページ >バックエンド開発 >C++ >この Null 許容整数の合計テストで、C# の 'as' 演算子が従来のキャストよりも遅いのはなぜですか?

この Null 許容整数の合計テストで、C# の 'as' 演算子が従来のキャストよりも遅いのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-07 09:11:40219ブラウズ

Why is C#'s

「as」と Null 許容型によるパフォーマンスの驚き

背景

「as」 C# の演算子を使用すると、動的な型チェックと安全なキャストが可能になります。これにより、従来の「is」演算子の後にキャストを行うよりもパフォーマンスが向上する可能性があります。ただし、最近のテスト ケースで予期しないパフォーマンス結果が観察されました。

テスト アプリと結果

NULL 参照を含むオブジェクト配列からの整数を合計するテスト アプリが開発されました。 、文字列参照、およびボックス化された整数。このアプリは、「Cast」 (C# 1 と同等)、「As」 (「as」演算子を使用)、および「LINQ」 (OfType() 拡張メソッドを使用) の 3 つのアプローチを使用しました。驚くべきことに、「Cast」アプローチは「As」アプローチよりも大幅に高速であり、その結果、「LINQ」アプローチよりもわずかに低速でした。

分析

JIT コンパイラは、メモリ内の値変換を利用するため、「キャスト」アプローチの非常に効率的なコードを生成できます。オブジェクトは、ボックス化された値と同じ型の変数にのみボックス化解除できます。これにより、キャスト プロセスが簡素化されます。

「As」アプローチでは、Nullable への変換が必要です。ボックス化された整数の値表現は Nullable のメモリ レイアウトと互換性がないためです。これは、追加のオーバーヘッドをもたらすヘルパー関数 JIT_Unbox_Nullable を通じて行われます。

「LINQ」アプローチでは、ヘルパー関数 JIT_Unbox() による「is」演算子と汎用キャストが使用されます。 "As" アプローチよりもパフォーマンスはわずかに優れていますが、ngen.exe の最適化により依然として遅くなります。

結論

"as" 演算子は常に使用できるとは限りません。特にパフォーマンスが重視される状況では、「キャスト」アプローチよりもパフォーマンス上の利点が得られます。 「LINQ」アプローチは実行可能な代替手段ですが、パフォーマンスの制限に遭遇する可能性もあります。したがって、最適なアプローチを選択する前に、特定のコンテキストを考慮し、トレードオフを比較検討することが重要です。

以上がこの Null 許容整数の合計テストで、C# の 'as' 演算子が従来のキャストよりも遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。