正在优化ValueType的属性getter

本文关键字:属性 getter ValueType 优化 | 更新日期: 2023-09-27 18:00:53

我有一个类似的类的层次结构

public class Class1
{
    internal DateTime time = DateTime.Now;
}
public class Class2
{
    internal Class1 C1;
    public Class2(Class1 c1) { C1 = c1; }
    public DateTime Time { get { return C1.time; } }
}
public class Class3
{
    internal Class2 C2;
    public Class3(Class2 c2) { C2 = c2; }
    public DateTime Time { get { return C2.Time; } }
}
public class Class4
{
    internal Class3 C3;
    public Class4(Class3 c3) { C3 = c3; }
    public DateTime Time { get { return C3.Time; } }
}

我想知道什么时候我打电话给

Class4 C4 = new Class4(.....);  
Console.WriteLine(C4.Time);

ValueType数据(在这种情况下是DateTime(会被复制4次吗?还是JIT编译器会优化代码并将其重新生成为像C4.C3.C2.C1.time; 这样的内联版本

C#编译器不进行任何优化。ILDASM生成的代码在这里:

// get { return C3.Time; }
.method public hidebysig specialname instance valuetype [mscorlib]System.DateTime 
        get_Time() cil managed
{
  // Code size       12 (0xc)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldfld      class CSTester.Class3 CSTester.Class4::C3
  IL_0006:  callvirt   instance valuetype [mscorlib]System.DateTime CSTester.Class3::get_Time()
  IL_000b:  ret
} // end of method Class4::get_Time
// get { return C2.Time; }
.method public hidebysig specialname instance valuetype [mscorlib]System.DateTime 
        get_Time() cil managed
{
  // Code size       12 (0xc)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldfld      class CSTester.Class2 CSTester.Class3::C2
  IL_0006:  callvirt   instance valuetype [mscorlib]System.DateTime CSTester.Class2::get_Time()
  IL_000b:  ret
} // end of method Class3::get_Time

EDIT:代码是在启用了优化的发布模式下编译的。

正在优化ValueType的属性getter

也许会的。也许不会。也许它会出现在CLR的某些版本、某些CPU架构上,但不会出现在其他版本上。

你必须问自己的问题是它到底有多重要。

你有绩效目标和基准吗?

你的代码符合他们的要求吗?

如果不是,你有理由相信这就是瓶颈吗?

我发现,除了少数应用程序之外,优化与否之间的差异不太可能在其他任何应用程序中产生重大影响。

Eric Lippert说我不知道比我更雄辩的了。

顺便说一句,

int sizeInBytes;
unsafe
{
    sizeInBytes = sizeof(DateTime);
}

对我来说,结果是值8,但依赖它是不安全的。复制24个字节不值得担心。如果是这样的话,也许这部分代码应该使用较低一代的语言。