由以下類型字段訪問與多個字段
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;
} }
產生我的計算機上執行以下有趣的結果代替以下簡短但完整的示例程序
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
用於類型更慢(Windows 7 .NET 4.5 32-bit)
SimpleClass 00:00:10.4471717 95,721,260 iterations/s ComplexClass 00:00:37.8199150 26,441,736 iterations/s SimpleStruct 00:00:12.3075100 81,254,571 iterations/s ComplexStruct 00:00:32.6140182 30,661,679 iterations/s
問題1:爲什麼ComplexClass
比SimpleClass
慢得多?經過的時間似乎隨着班級中的字段數量線性增加。寫一個有很多字段的類的第一個字段應該與僅寫入一個字段的一個類的第一個字段不同,不是嗎?
問題2:爲什麼ComplexStruct
慢於SimpleStruct
?查看IL代碼可以看出,i
是直接寫入數組,而不是寫入ComplexStruct
的本地實例,然後被複制到數組中。所以不應該複製更多的字段造成開銷。
獎勵問題:爲什麼ComplexStruct
快於ComplexClass
?
編輯:更新測試結果具有更小的陣列,T[] array = new T[1 << 8];
:
SimpleClass 00:00:13.5091446 74,024,724 iterations/s ComplexClass 00:00:13.2505217 75,471,698 iterations/s SimpleStruct 00:00:14.8397693 67,389,986 iterations/s ComplexStruct 00:00:13.4821834 74,172,971 iterations/s
所以幾乎SimpleClass
和ComplexClass
,只有SimpleStruct
和ComplexStruct
之間的微小差異之間沒有什麼區別。但是,SimpleClass
和SimpleStruct
的性能顯着下降。
編輯:現在與T[] array = new T[1 << 16];
:
SimpleClass 00:00:09.7477715 102,595,670 iterations/s ComplexClass 00:00:10.1279081 98,745,927 iterations/s SimpleStruct 00:00:12.1539631 82,284,210 iterations/s ComplexStruct 00:00:10.5914174 94,419,790 iterations/s
結果爲1<<15
就像1<<8
,併爲1<<17
結果是一樣1<<20
。
我很有興趣聽到有確定知識答案的人。我認爲有一件事情會導致複雜版本變得越來越慢,這是因爲必須從內存移動到CPU緩存的數據量增加。 – hatchet
我同意Carson63000,簡單結構和複雜結構之間的區別幾乎肯定是由於複雜類型的緩存優勢較少造成的。至於結構與類,結構是一個值類型,而類是一個引用類型,所以有一個額外的間接進行類。 –
另一個有趣的問題是爲什麼SimpleStruct不比SimpleClass更快?我本來預計這是最快的。 – hatchet