次の短いが完全なサンプル プログラム
const long iterations = 1000000000;
T[] array = new T[1 << 20];
for (int i = 0; i < array.Length; i++)
{
array[i] = new T();
}
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
array[i % array.Length].Value0 = i;
}
Console.WriteLine("{0,-15} {1} {2:n0} iterations/s",
typeof(T).Name, sw.Elapsed, iterations * 1000d / sw.ElapsedMilliseconds);
次のタイプにT
置き換えられます
class SimpleClass struct SimpleStruct
{ {
public int Value0; public int Value0;
} }
class ComplexClass struct ComplexStruct
{ {
public int Value0; public int Value0;
public int Value1; public int Value1;
public int Value2; public int Value2;
public int Value3; public int Value3;
public int Value4; public int Value4;
public int Value5; public int Value5;
public int Value6; public int Value6;
public int Value7; public int Value7;
public int Value8; public int Value8;
public int Value9; public int Value9;
public int Value10; public int Value10;
public int Value11; public int Value11;
} }
私のマシン(Windows 7 .NET 4.5 32ビット)で次の興味深い結果が得られます
SimpleClass 00:00:10.4471717 95,721,260 回/秒 ComplexClass 00:00:37.8199150 26,441,736 回/秒 SimpleStruct 00:00:12.3075100 81,254,571 回/秒 ComplexStruct 00:00:32.6140182 30,661,679 回/秒
質問 1:ComplexClass
がよりもずっと遅いのはなぜSimpleClass
ですか? 経過時間は、クラス内のフィールド数に比例して増加するようです。多くのフィールドを持つクラスの最初のフィールドへの書き込みは、フィールドが 1 つしかないクラスの最初のフィールドへの書き込みとあまり変わらないはずですよね?
質問 2:ComplexStruct
がよりも遅いのはなぜSimpleStruct
ですか? IL コードを見ると、それが配列にコピーされるi
ローカル インスタンスではなく、配列に直接書き込まれていることがわかります。ComplexStruct
そのため、より多くのフィールドをコピーすることによるオーバーヘッドは発生しません。
おまけの質問:ComplexStruct
がより速いのはなぜComplexClass
ですか?
編集:より小さな配列でテスト結果を更新しましたT[] array = new T[1 << 8];
:
SimpleClass 00:00:13.5091446 74,024,724 回/秒 ComplexClass 00:00:13.2505217 75,471,698 回/秒 SimpleStruct 00:00:14.8397693 67,389,986 回/秒 ComplexStruct 00:00:13.4821834 74,172,971 回/秒
したがって、 と の間に実質的に違いはなく、 と の間SimpleClass
にComplexClass
はわずかな違いしかありSimpleStruct
ませんComplexStruct
。ただし、 と のパフォーマンスは大幅に低下しましSimpleClass
たSimpleStruct
。
編集:そして今T[] array = new T[1 << 16];
:
SimpleClass 00:00:09.7477715 102,595,670 回/秒 ComplexClass 00:00:10.1279081 98,745,927 回/秒 SimpleStruct 00:00:12.1539631 82,284,210 回/秒 ComplexStruct 00:00:10.5914174 94,419,790 回/秒
の結果1<<15
は のよう1<<8
になり、 の結果1<<17
は のようになり1<<20
ます。