C# 优化ValueType的属性getter

C# 优化ValueType的属性getter,c#,.net,optimization,compiler-construction,inline,C#,.net,Optimization,Compiler Construction,Inline,我有这样的类的层次结构 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 {

我有这样的类的层次结构

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

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

可能会。也许不会。在某些版本的CLR上,在某些CPU架构上,可能会出现这种情况,但在其他架构上不会

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

你有业绩目标和基准吗

你的代码符合他们吗

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


我发现,除了少数几个应用程序之外,优化与否的区别在其他任何应用程序中都不太可能是显著的。

也许会。也许不会。在某些版本的CLR上,在某些CPU架构上,可能会出现这种情况,但在其他架构上不会

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

你有业绩目标和基准吗

你的代码符合他们吗

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

我发现,除了少数几个应用程序之外,优化与否之间的差异在任何其他应用程序中都不太可能有重大意义。

比我更雄辩

另一方面

int sizeInBytes;
unsafe
{
    sizeInBytes = sizeof(DateTime);
}
结果对我来说是8,但依赖它是不安全的。24字节的复制不值得担心。如果是的话,也许应该为这部分代码使用较低一代的语言。

比我更有说服力

另一方面

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

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

在启用优化的发行版中编译?如果是这样的话,我想JIT可以完成这项工作。在发行版中编译并启用优化?如果是这样的话,我想JIT可以完成这项工作。我想,与实例化引用类型时执行的其他活动相比,复制和分配一些
DateTime
s肯定是微不足道的。@Jodrell:我希望如此,是的。我不知道日期时间有多大,但我怀疑它是否超过16字节……我的问题不是性能。显然,未优化的代码可能会多复制几个字节。我甚至可以自己做内联。我只是想知道。@sad_-man:当你在问优化问题时,它在哪方面与性能无关?您认为优化的目的除了性能之外还有什么?我想,与实例化引用类型时执行的其他活动相比,复制和分配一些
DateTime
s肯定是微不足道的。@Jodrell:我希望如此,是的。我不知道日期时间有多大,但我怀疑它是否超过16字节……我的问题不是性能。显然,未优化的代码可能会多复制几个字节。我甚至可以自己做内联。我只是想知道。@sad_-man:当你在问优化问题时,它在哪方面与性能无关?除了性能,您认为优化的目的是什么?