C# 動的変数のパフォーマンスへの影響
C# の動的変数はパフォーマンスに影響を与える可能性があり、それらがトリガーする再コンパイルの範囲とそのパフォーマンスへの影響について懸念が生じます。
動的変数のコンパイラの動作
明確にしておきますが、コンパイラは動的変数を含むメソッド全体を再コンパイルしません。代わりに、コンパイラは、コード内で検出された動的式ごとに動的呼び出しサイト オブジェクトを生成します。
動的呼び出しサイト オブジェクト
これらの動的呼び出しサイト オブジェクトには、実行されている操作に関する情報が含まれています。たとえば、式 d1.Foo() がある場合、コンパイラは、d1 によって参照されるオブジェクトの Foo メソッドへの呼び出しを表す動的呼び出しサイト オブジェクトを作成します。
動的言語ランタイム (DLR)
動的式を実行するとき、DLR は、関与するオブジェクトが COM オブジェクトであるか Iron Python オブジェクトであるかなど、特別な機能を持っているかどうかを尋ねます。そうでない場合、DLR はそれを通常の C# オブジェクトとして扱います。
C# コンパイラ呼び出し
通常の C# オブジェクトの場合、DLR は C# コンパイラの軽量バージョンを使用して、オブジェクトの型と呼び出されるメソッドを分析します。コンパイラは、操作を表す式ツリーを構築し、それを DLR に返します。
キャッシュと IL 生成
DLR は、将来同じタイプのオブジェクトに対して同じ操作を実行するために式ツリーをキャッシュします。キャッシュ ヒットが発生した場合、DLR はキャッシュされた式ツリーを IL にコンパイルし、コンパイラー分析をバイパスして、生成されたデリゲートを直接呼び出します。
パフォーマンスへの影響
このプロセスでは、発生するすべての動的式にオーバーヘッドが発生します。オーバーヘッドは、動的操作が頻繁に実行される場合、特に異なるタイプのオブジェクトを処理する場合に最も顕著になります。
ベンチマーク結果
質問で提供されているサンプル コードは、動的変数によって引き起こされる重大なパフォーマンスへの影響を示しています。単純な for ループで動的変数を使用すると、int 変数を使用した場合と比較して実行が 2 桁遅くなる可能性があります。
結論
動的変数は柔軟性を提供しますが、パフォーマンスへの影響を認識することが重要です。コードのパフォーマンスが重要なシナリオでは、動的変数の過度の使用を避けるか、静的に型指定された代替変数の使用を検討することをお勧めします。
以上がC# の動的変数はパフォーマンスにどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。