【问题标题】:performance difference between c# object initializations [duplicate]c#对象初始化之间的性能差异[重复]
【发布时间】:2015-02-15 00:42:36
【问题描述】:

这可能是重复的,但我无法从询问时提出的建议中找到与我的问题完全匹配的问题:

c# 中的以下内容之间是否存在很大的性能差异(如果有):

var object = new object();
object.propx = x;
object.propy = y;

var object = new object { propx = x, propy = y};

【问题讨论】:

  • 一个很好的发现方法是测试它。我的直觉告诉我,根据编译器的不同,它会编译成相同的 IL。
  • 是的,但我不知道怎么做,我现在正在工作中,几天后就会有截止日期
  • @itsme86 - 正确的方法是查看 IL...但确实是 horses
  • 后者只是前者的语法糖。
  • 如果您正在为最后期限工作,这应该是无关紧要的,除非您确实有性能问题并且将其范围缩小到对象初始化程序(后者几乎是不可能的)。跨度>

标签: c#


【解决方案1】:

不,没有区别,因为它会产生相同的 IL。

编译如下:

class Program
{
    static void Main(string[] args)
    {
        var objectA = new Test();
        objectA.PropA = 1;
        objectA.PropB = 10;

        var objectB = new Test() { PropA = 2, PropB = 20 };
    }
}

public class Test
{
    public int PropA { get; set; }
    public int PropB { get; set; }
}

会产生以下IL(释放模式):

IL_0000: newobj instance void InitTest.Test::.ctor()
IL_0005: dup
IL_0006: ldc.i4.1
IL_0007: callvirt instance void InitTest.Test::set_PropA(int32)
IL_000c: ldc.i4.s 10
IL_000e: callvirt instance void InitTest.Test::set_PropB(int32)
IL_0013: newobj instance void InitTest.Test::.ctor()
IL_0018: dup
IL_0019: ldc.i4.2
IL_001a: callvirt instance void InitTest.Test::set_PropA(int32)
IL_001f: dup
IL_0020: ldc.i4.s 20
IL_0022: callvirt instance void InitTest.Test::set_PropB(int32)
IL_0027: pop
IL_0028: ret

在创建实例后,两者都以相同的方式调用 setter 方法。

【讨论】:

  • 这不完全相同——对象初始化器有一个额外的dup。然而,更重要的是,您根本没有使用变量,因此对象初始化器声明了一个额外变量的事实(因为保证该变量永远不会有一个只是一部分的值-way 初始化)被优化掉。我建议您在每个实例初始化后添加一个Console.WriteLine(objectA)(或objectB),您会看到对象初始化程序代码明显不同。并不是说您应该在这里关心性能,但存在差异。
  • @KirkWoll:是的 - 我删除了完全。我还通过访问检查了它,然后所有dups 都消失了,但是对象初始化程序还有一个额外的stlocldloc(请参阅pastebin.com/PrsSdzG8),但我不知道它们到底是什么,因为我不是“精通 IL”。
  • 你应该比较jitter产生的实际机器语言,而不是IL。
  • 基本上,stlocldloc 是用于存储和加载局部变量的 IL-speak。 (尽管这过于简单,因为它们通常用于您未在代码中声明的变量) 案例:对象初始化器语法在一个存储位置创建对象,对其进行初始化,最后将其存储在最终位置代表你声明的变量。这可能会产生微妙的语义后果,因为这意味着变量在完全初始化之前无法使用(可能在不同的线程上)。
猜你喜欢
  • 2013-12-02
  • 1970-01-01
  • 2015-07-16
  • 2015-12-03
  • 2020-02-11
  • 1970-01-01
  • 2013-07-23
  • 2012-01-17
  • 2019-09-16
相关资源
最近更新 更多