2009-09-03 10 views
2

参照型が値型よりも効率的な時間はありますか?どうして ?あなたは例を挙げることができますか?C#では、参照型が値型より効率的なのはいつですか?

+1

どのように効率的ですか? –

+0

この質問はあまりにも開いている。より具体的なものは何か、または記事にはこれを参照するものがありますか? – snarf

+0

効率的には、少ないメモリ、処理能力、またはその両方を使用するかどうかにかかわらず、パフォーマンスが向上することを意味します。 Jon Skeetの "C Sharp in depth"という本の第2章で読みましたが、理由を理解できませんでしたので、私はここで質問する必要があります。 – bluediapente

答えて

10

いつでも、たくさんのオブジェクトの間を渡します。

値の型を持つメソッドを呼び出すたびに、または別の場所に割り当てられるたびに、値型のメンバーの完全なコピーが必要です。かなりの数のメンバーがいる場合は、パフォーマンスが大幅に低下する可能性があります。例えば

は、あなたが20 int型の値を持つオブジェクトを持っていると言う:

public class MyClass { int a; int b; int c; ... } 
public class MyStruct { int a; int b; int c; ... } 

我々はこれを行う場合は、次の

MyClass class = new MyClass(); 
MyClass struct = new MyStruct(); 

this.CallSomeMethod(class); // Just copies one IntPtr reference! 
this.CallSomeMethod(struct); // Needs to copy a large amount of data to run - 20x the other on x86, 10x on x64, since it's 20 Int32 values! 
4

質問には明確な答えを持っているにはあまりにも広いです。あなたが10kオブジェクトを持ち、それを再帰関数に渡す場合の例があります。値の型を使用する場合は、メソッドを呼び出すたびに、全体をコピーします。

0

値型メンバには、追加レベルの間接化を行わずにアクセスできます。一般的な参照型は良い出発点です。アプリケーションをプロファイルする必要があります。メンバーを参照してパフォーマンスの重大な問題が発生した場合は、設計上適用可能な場合は値型を使用できます。

非常に小さい構造体では、プロファイリングなしの値型を使用できます。特に、あなたのstrctに4バイトの値しか入っていない場合、 64ビットのプラットフォームでは、すべての参照(間接参照)が8バイトのメモリにかかります。今後登場するx64 Windows版では、CPUレジスタに8バイトを格納できることに注意してください。あなたの構造体が8バイトほど小さい場合、それはレジスタに保持することができます。

すでに値の型は値渡しの呼び出しで完全にコピーする必要があることに注意してください。あなたの構造体が8バイトよりもはるかに大きい場合、これはパフォーマンスに大きな影響を与える可能性があります。

0

効率的で、我々はその後、CPUにあまり指示を意味する場合:

  1. 値の型は参照型のデフォルトながら、null参照に、デフォルト値を初期化するデフォルトコンストラクタを持っています。

  2. 変更中に、ある値タイプの値を変更しても、別の値タイプには影響しません。参照タイプの値によって、他の参照タイプの値が変更されることがあります。

0

私は実際にそこに問題がある場合を除き、パフォーマンスよりもセマンティクスについてもっと考えてみます。したがって、値のように動作し、値のセマンティクスを持つものが必要な場合は、構造体を使用します。それ以外の場合は、クラスを使用します。

ほとんどのコードでは、パフォーマンスが問題になるほどオブジェクトが複雑であるように、おそらく価値のセマンティクスを望んでいないと考えられます。

関連する問題