这blog说
12)在函数/方法中包含返回语句。 它如何提高性能 显式地使用return允许JIT执行稍微更优化。如果没有return语句,每个函数/方法都会在堆栈上给出几个局部变量,以透明地支持没有关键字的返回值。保持这些可以使JIT更难以优化,并且可以影响代码的性能。查看您的函数/方法并根据需要插入return。它根本不会改变代码的语义,它可以帮助您从应用程序中获得更快的速度。
我很确定这是一个错误的陈述。但希望得到意见专家。你们觉得怎么样?
答案 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语句的方法。但这只是我个人的意见。我会在可读性方面犯错误,除非你正在处理实时必须走的更快的情况,否则不要担心优化。