.net 为C#方法添加return语句是否会提高性能?

kpbpu008  于 2023-03-31  发布在  .NET
关注(0)|答案(6)|浏览(171)

blog
1.在函数/方法中包含返回语句。它如何提高性能显式使用return允许JIT执行稍微多一点的优化。没有return语句,每个函数/方法在堆栈上都有几个局部变量,以透明地支持不带关键字的返回值。保留这些会使JIT更难优化,并且可能会影响代码的性能。查看您的函数/方法并根据需要插入return。它根本不会改变代码的语义,并且可以帮助您从应用程序中获得更快的速度。
我相当肯定这是一个错误的说法。但我想让Maven们发表意见。你们怎么看?

t1qtbnec

t1qtbnec1#

这句话不适用于C#。
在C#中,你必须显式地设置一个“return”才能有一个有效的函数,如果没有return,你会得到一个编译错误,大意是“不是所有的代码路径都返回一个值”。
在VB.NET中,这将适用于VB.NET,因为VB.NET没有显式返回的要求,并且允许您拥有从不返回值的函数,以及允许您使用函数的名称设置返回。
举个例子
在VB.NET中你可以这样做

Function myFunction() As String
    myFunction = "MyValue"
End Function

Function myFunction2() As String
    'Your code here
End Function

上面的编译,既没有显式的“返回”,也有更多的开销。
如果你尝试用C#来做这件事

string myFunction()
{
    //Error due to "Cannot assign to 'myFunction' because it is a 'Method Group'
    myFunction = "test";
}

string myFunction2()
{
    //Error due to "not all code paths return a value
}

我的评论注意到你得到的错误。

i2byvkas

i2byvkas2#

这篇文章有点模糊。作为一名C#开发人员,我的第一个想法是“反对什么?”。然而,他可能指的是这样的东西:

public bool MyFunction()
{
    bool result = false;
    if (someCondition == true)
    {
        // Do some processing
        result = true;
    }
    else if (someOtherCondition == true)
    {
       // Do some processing
       result = true;
    }
    // ... keep going

    return result;
}

他可能建议用return true;替换result = true;语句可能会有更好的性能。我个人对此不太确定......这在JIT理论中已经很深入了,我认为与您可以实现的其他性能改进相比,所获得的任何收益都是非常小的。

30byixjq

30byixjq3#

我不同意--我认为每个方法都有一个单独的输入和输出会让代码更容易阅读和调试。一个函数中有多个return语句会让代码导航更加复杂。事实上(如果可能的话),拥有更多的小函数比拥有多个出口的大函数更好。

hc2pp10m

hc2pp10m4#

对于VB.NET和C#来说,这在一定程度上是正确的。在C#中,程序员必须显式声明保存返回值的变量,这在VB.NET中是自动的。大多数返回值都在EAX或RAX寄存器中返回,JIT编译器必须在函数退出之前生成代码以从返回值变量加载寄存器。当您使用return语句时,JIT编译器可能有机会直接加载EAX寄存器,或者已经具有包含正确值的寄存器,并且跳过从变量加载指令而跳转到函数退出代码。
顺便说一句,这是一个相当大的“可能性”,真实的的代码总是用if来测试某个表达式()语句。计算该表达式几乎总是涉及使用EAX寄存器,它仍然必须用返回值重新加载。与x86编译器相比,x64 JIT编译器在这方面做了完全不同的工作,后者似乎总是在我做的一些抽查中使用该变量。所以除非你运行的是64位版本的Windows,否则你不太可能领先。
在过早优化的所有坏处中,这一点可以说是最糟糕的。潜在的时间节省是微不足道的,先写代码,然后再写概要。

ergxz8rk

ergxz8rk5#

我唯一的猜测是他说的是VB.NET而不是C#。VB.NET允许你像这样返回值

Public Function GetSomething() As Int
     GetSomething = 4
End Function

我的VB已经过时了,这可能比使用显式的return语句要慢

czfnxgou

czfnxgou6#

通常有两个地方我退出一个函数。在我的方法开始验证传入数据时:

if (myParameter == null)
   throw new ArgumentNullException("myParameter");

和/或在该方法的最后。

private bool GetSomeValue()
{
    bool returnValue = false;
    // some code here
    if (some condition)
    {
        returnValue = some expression
    }
    else
    {
        returnValue = some other expression;
    }
    return returnValue;
}

我不在条件语句中返回的原因是,这样函数就有一个退出点,这有助于调试。没有人愿意维护一个有12个return语句的方法。但这只是我个人的观点。我会在可读性方面犯错,除非你正在处理一个实时的必须更快的情况,否则我不会担心优化。

相关问题