.NET返回值优化

Pie*_*ald 5 c#

.NET编译器会优化这个:

public MyObject GetNewObject()
{
    var newCurrentObject = myObjectFactory.CreateNew(
                                 DateTime.Now, 
                                 "Frank", 
                                 41, 
                                 secretPassword);

    return newCurrentObject;
}
Run Code Online (Sandbox Code Playgroud)

执行与此相同数量的指令/内存:

public MyObject GetNewObject()
{
    return myObjectFactory.CreateNew(
                        DateTime.Now, 
                        "Frank", 
                        41, 
                        secretPassword);
}
Run Code Online (Sandbox Code Playgroud)

或者局部变量会导致额外的时间和内存花费来创建MyObject的引用(newObject),只有当它超出范围时才会将其销毁到下一行.

我问因为,性能完全相同,我发现第一个更具可读性,因为局部变量名称通常可以给下一个开发人员一些关于我们在这里做什么的背景.

usr*_*usr 6

假设MyObject是引用类型,将为两种情况生成相同的x86.JIT非常有能力优化标量临时和任务.这是最基本的优化之一.几乎所有优化器都在内部使用SSA表单,这种优化几乎不属于SSA形式.

假设MyObjectstruct:我已经广泛测试了.NET 4.5 JIT和用于结构优化的新RyuJIT..NET JIT通常不优化结构分配和(本地)变量.代码是字面翻译的,除了一个不适用的小案例.期待完全文字的机器代码.即使你说a = a;或者a.x = 1; a.x = 1;你得到了机器代码.如果结构对您很重要,请发送邮件给团队.现在还是时候做出改变了.