我构建了一个测试并获得了以下结果:
分配类:15.3260622,分配结构:14.7216018。
在分配结构而不是类时看起来有4%的优势。这很酷但是真的足以添加语言值类型吗?在哪里可以找到一个显示结构真正击败类的例子?
void Main()
{
var stopWatch = new System.Diagnostics.Stopwatch();
stopWatch.Start();
for (int i = 0; i < 100000000; i++)
{
var foo = new refFoo()
{
Str = "Alex" + i
};
}
stopWatch.Stop();
stopWatch.Dump();
stopWatch.Restart();
for (int i = 0; i < 100000000; i++)
{
var foo = new valFoo()
{
Str = "Alex" + i
};
}
stopWatch.Stop();
stopWatch.Dump();
}
public struct valFoo
{
public string Str;
}
public class refFoo
{
public string Str;
}
答案 0 :(得分:6)
你的方法是错误的。您主要测量字符串分配,整数到字符串的转换以及字符串的连接。这个基准是不值得写的。
为了看到结构的好处,比较分配1000个对象的数组和1000个结构的数组。对于数组对象,您需要为数组本身分配一个,然后为数组中的每个对象分配一个。对于结构数组,您可以为结构数组分配一个。
另外,请查看.Net集合的C#源代码中List类的Enumerator的实现。它被声明为结构。那是因为它只包含一个int,所以整个枚举器结构都适合机器字,因此非常便宜。
答案 1 :(得分:-4)
尝试一些更简单的测试:
int size = 1000000;
var listA = new List<int>(size);
for (int i = 0; i < size; i++)
listA.Add(i);
var listB = new List<object>(size);
for (int i = 0; i < size; i++)
listB.Add(i);
要在第一种情况下存储1000000个整数,系统将分配4000000个字节。第二,如果我没有弄错 - 大约12000000字节。而且我怀疑性能差异会大得多。