为C#方法添加return语句是否可以提高性能?

时间:2010-03-05 15:35:28

标签: c# .net

blog

  

12)在函数/方法中包含返回语句。   它如何提高性能   显式地使用return允许JIT执行稍微更优化。如果没有return语句,每个函数/方法都会在堆栈上给出几个局部变量,以透明地支持没有关键字的返回值。保持这些可以使JIT更难以优化,并且可以影响代码的性能。查看您的函数/方法并根据需要插入return。它根本不会改变代码的语义,它可以帮助您从应用程序中获得更快的速度。

我很确定这是一个错误的陈述。但希望得到意见专家。你们觉得怎么样?

6 个答案:

答案 0 :(得分:10)

此声明不适用于C#。

使用C#,你必须明确地设置一个“return”以获得一个有效的函数,而不返回,你得到一个编译错误,效果为“并非所有代码路径都返回一个值”。

使用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
}

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

答案 1 :(得分:4)

该帖子有点模糊。作为一名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;
}

他可能会建议用result = true;替换return true;语句可能会表现得更好。我个人并不确定......那时候JIT理论非常深入,我认为与你可以做的其他性能改进相比,所取得的任何收益都会非常小。

答案 2 :(得分:3)

我不同意 - 我认为每种方法中的单个输入和单个输出使代码更容易阅读和调试。函数中的多个return语句可以使导航代码更加复杂。事实上(如果可能的话,重构)它的功能比具有多个出口的更大功能更好。

答案 3 :(得分:2)

对VB.NET和C#来说都是如此。在C#中,程序员必须声明显式保存返回值的变量,它在VB.NET中是自动的。大多数返回值在EAX或RAX寄存器中返回,JIT编译器必须生成代码以在函数退出之前从返回值变量加载寄存器。当您使用return语句时,JIT编译器可能有机会直接加载EAX寄存器,或者已经有包含正确值的寄存器,并跳转到函数退出代码,绕过load-from-variable指令。

这是一个相当大的“可能”顺便说一下,真正的代码总是使用if()语句测试一些表达式。评估该表达式几乎总是涉及使用EAX寄存器,它仍然必须重新加载返回值。与x86编译器相比,x64 JIT编译器执行完全不同的工作,后者似乎总是在我做的一些抽样检查中使用该变量。因此,除非您运行64位版本的Windows,否则您不可能领先。

在过早优化的所有邪恶中,这个可以说是最糟糕的。潜在的时间节省是微不足道的,为了清晰起见,请编写代码。简介。

答案 4 :(得分:1)

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

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

我的VB虽然已经过时了。使用显式返回语句

可能会慢一些

答案 5 :(得分:0)

一般来说,有2个点可以退出函数。 在我验证传入数据的方法的最开始:

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;
}

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

相关问题