提前返回还是让代码完成更快?

本文关键字:代码 返回 | 更新日期: 2023-09-27 18:09:15

如果我有一个包含大量If else语句的方法,例如:

public void myMethod()
{
    if(..)
    else if(..)
    else if(...)
    else if(...)
    else if(...)
    //and so on            
}

将return放在这些语句中会更快,这样在发现一个语句为真后就不会检查其余的代码,还是让编译器击中结束括号会更快?

我想这可以归结为一个问题:return语句是否有效?

问题的要点是:假设你有一个不断运行的游戏循环,其中包含许多方法和"else if"的代码。如果我必须每秒60次更新2000个不同的对象,那么每秒至少要检查120000个"else If"。因此,随着时间的推移,这个问题的答案可能会产生影响。

提前返回还是让代码完成更快?

没关系。
任何正常或不正常的编译器都会为这两个选项生成相同的字节码。(假设你写的代码实际上是等价的)

SLaks的回答当然是正确的。但我认为你问这个问题本身就表明你对"如果-否则"的含义有误解。当你说

if(x) X();
else if(y) Y();
else if(z) Z();
return;

意思完全一样
if(x)
{
  X();
}
else
{
  if (y)
  {
    Y();
  }
  else
  {
    if (z)
    {
      Z();
    }
  }
}
return;

如果取走x,则从不检查y;控制直接跳到X()之后的return

事实上,在c#中没有"else if"这样的东西——或者C、c++、Java或JavaScript。只有"else";如果你碰巧把if语句放在else语句之后,那是你的事。除了这个

,没有else if了
if (x) X();
else while(y) Y();

是一个"else while"语句。你可以在else后面放任何你想要的语句;(*)

大多数人选择放置if或块语句,但您可以在那里放置任何您喜欢的语句。

更新:

我理解else if"跳过",问题的关键是添加一个返回是否会让它直接跳出来,而不需要花时间跳过它们。例如,在极端情况下,一行中有一百万条if else语句。它仍然需要找到这条线的终点(这可能需要时间)。我说的对吗?

好的,我们需要去一个更低的水平。if-else语句是这样编译的:

if (condition) 
    Consequence() 
else 
    Alternative();
Continuation();

实际上被转换成一系列goto语句:

if (!condition) 
    goto ALTERNATIVE;
Consequence();
goto CONTINUATION;
ALTERNATIVE:  Alternative();
CONTINUATION: Continuation();

所以如果你有

if (x) X(); 
else if (y) Y();
else if (z) Z();
return;

第一个变成

if (x)
    X(); 
else 
{
    if (y)
        Y();
    else
    {
        if (z)
            Z();
    }
}

变成

if (!x) goto XALTERNATIVE;
X(); 
goto CONTINUATION;
XALTERNATIVE: if (!y) goto YALTERNATIVE;
Y();
goto CONTINUATION;
YALTERNATIVE: if (!z) goto CONTINUATION;
Z();
CONTINUATION: return;

这样回答你的问题了吗?


(*)除了局部声明;c#不允许。

作为条件的保护是有效的,但在您的情况下,这无关紧要,因为一旦其中一条语句被执行,其他语句就不会被验证,但是如果您要做这样的事情:

if(...){return;}
if(...){return;}
if(...){return;}
if(...){return;}
if(...){return;}