【发布时间】:2012-03-16 03:18:45
【问题描述】:
我并不是真正对应用程序的性能进行微观管理,但我对以下场景很感兴趣。
对于 Structs,默认情况下,C# 编译器会生成布局 LayoutType。顺序的。这意味着字段应保持程序员定义的顺序。我相信这是为了支持与非托管代码的互操作性。然而,大多数用户定义的结构与互操作性无关。我读过,为了获得更好的性能,我们可以显式指定 LayoutKind.Auto,并让 CLR 决定可能的最佳布局。为了对此进行测试,我想对这两种布局进行快速基准测试。但是我的结果表明默认布局(LayoutType.Sequnetial)比显式布局(LayoutType.Auto)快一点。我期待相反的结果。
以下是我在我的机器上运行的测试(x86 运行 .NET 4)
//uses LayoutKind.Sequence by default
public struct StructSeq
{
private readonly Byte mb;
private readonly Int16 mx;
public string a;
public string b;
public string c;
public string d;
}
[StructLayout(LayoutKind.Auto)]
public struct StructAuto
{
private readonly Byte mb;
private readonly Int16 mx;
public string a;
public string b;
public string c;
public string d;
}
public sealed class Program
{
public static void Main()
{
StructSeq sq = new StructSeq();
Stopwatch sw1 = new Stopwatch();
sw1.Start();
for (int i = 0; i < 10000; i++)
{
sq = ProcessStructSeq(sq);
}
sw1.Stop();
Console.WriteLine("Struct LayoutKind.Sequence (default) {0}", sw1.Elapsed.TotalMilliseconds);
StructAuto so = new StructAuto();
Stopwatch sw2 = new Stopwatch();
sw2.Start();
for (int i = 0; i < 10000; i++)
{
so = ProcessStructAuto(so);
}
sw2.Stop();
Console.WriteLine("Struct LayoutKind.Auto (explicit) {0}", sw2.Elapsed.TotalMilliseconds);
Console.ReadLine();
}
public static StructSeq ProcessStructSeq(StructSeq structSeq)
{
structSeq.a = "1";
structSeq.b = "2";
structSeq.c = "3";
structSeq.d = "4";
return structSeq;
}
public static StructAuto ProcessStructAuto(StructAuto structAuto)
{
structAuto.a = "1";
structAuto.b = "2";
structAuto.c = "3";
structAuto.d = "4";
return structAuto;
}
}
下面是我在我的机器上得到的示例结果(x86 运行 .NET 4)
Struct LayoutKind.Sequence(默认)0.7488
Struct LayoutKind.Auto(显式)0.7643
我多次运行此测试,我总是得到 Struct LayoutKind.Sequence (default)
即使是微毫秒的差异,我希望 Struct LayoutKind.Auto(显式)低于 Struct LayoutKind.Sequence(默认)。
有人知道这是什么原因吗?还是我的基准测试不够准确,无法给我正确的结果?
【问题讨论】:
标签: c# performance c#-4.0 clr