ダウンキャスティングのパフォーマンスにどのような影響がありますか?

StackOverflow https://stackoverflow.com/questions/305755

  •  08-07-2019
  •  | 
  •  

質問

Juvalのこの啓発的な記事を読んで、ジェネリック医薬品について頭を悩ませようとしています。 Lowy

言い換え..汎用クラス定義を定義すると、ILにコンパイルされます。

  • 値タイプの場合、特定の値タイプを要求するとすぐに、Tを特定の値タイプに置き換えて、その特定の構成のILを取得します。 MyList<int> 利点:ボクシングおよびボクシング解除のペナルティなし。
  • すべてが良い..参照型の場合、コンパイラは定義内のTのすべてのインスタンスをObjectに置き換え、すべてのref型に使用されるILを作成します。ただし、インスタンスは、実際に要求されたrefタイプに基づいて割り当てられます。 MyList<String>

これで、Objectパラメーターを受け取るメソッドを作成することができました。 Genericsは、「使用したいオブジェクトタイプを特定のタイプにダウンキャストするときに発生するパフォーマンスペナルティを回避する」ため、パフォーマンスが100%向上すると主張しています

 // assume GetItem returns an Object
 string sMyPreciousString = (string) obList.GetItem(); 

Objectから特定の参照タイプにダウンキャストすると、このパフォーマンスヒットはどうなりますか?また、Objectへのアップキャスト(ジェネリックでもこれを行う)はパフォーマンスに影響しないようです。なぜですか?

役に立ちましたか?

解決

オブジェクトへのアップキャストは実行時間のチェックを必要としません-それは常に機能し、基本的にノーオペレーションです。

ダウンキャストでは、たとえばストリームを文字列にキャストしていないことを確認するために、実行時間のチェックが必要です。これは非常に小さなペナルティであり、ボトルネックになることはほとんどありませんが、それを回避することはジェネリック医薬品の追加の利点の1つにすぎません。

他のヒント

パフォーマンスヒットは、実行時の型チェックの必要性から生じます。 BがAのサブクラスである場合、BをAにキャストすると、すべてのBがAsであるため、コンパイル時にそれが安全であることがわかります。したがって、タイプを確認するためにランタイムコードを生成する必要はありません。

ただし、AをBにキャストする場合、コンパイル時にAが実際にBであるかどうかはわかりません。それは単にAである可能性があり、タイプC、Aの異なるサブタイプである可能性があります。したがって、オブジェクトが実際にBであることを確認し、そうでない場合は例外をスローするランタイムコードを生成する必要があります。

Genericsにはこの問題はありません。コンパイラーはコンパイル時にBのみがデータ構造に入れられていることを知っているので、何かを引き出すと、コンパイラーはそれがBになることを知っているので、実行時に型チェックが必要です。

生成されるILの詳細(この記事に記載されています)。 .. aha-isinst。

ダウンキャストしていない場合は、 isinst

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top