c#中的goto语句是否缓慢?

kev*_*628 8 c# goto

我正在开发一个C#.NET应用程序,它在大型数据集上使用一些相当复杂的科学公式(平均1000万个数据点).我正在做的部分工作需要尽可能优化配方实施.

我注意到一个公式实现使用goto,这让我想知道:是否比其他流控制结构慢?

jas*_*son 11

是否比其他流控制结构慢?

不,所有其他流量控制结构基本上都是goto.

  • 这是一个非常合理的问题.当人们看到与"goto"有关的事情时,人们只会在内心做出反应. (3认同)

Bri*_*eon 6

我注意到一个公式实现使用了 goto,这让我想知道:goto 是否比其他流程控制结构慢?

goto不会比任何其他流量控制机制慢。与大多数流控制机制一样,它被编译成br.s(或类似的)MSIL 指令。然而,在某些情况下goto可能会稍微快一些。它们主要限于涉及使用breakcontinue内部嵌套循环的情况。考虑以下代码。

bool condition = false;
for (int i = 0; i < BigNumber; i++)
{
    for (int j = 0; j < i; j++)
    {
        for (int k = 0; k < j; k++)
        {
            condition = Evaluate(i, j, k);
            if (condition)
            {
              // break out of everything
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有多种方法可以让你摆脱整个困境。这是一种方法。

bool condition = false;
for (int i = 0; i < BigNumber; i++)
{
    for (int j = 0; j < i; j++)
    {
        for (int k = 0; k < j; k++)
        {
            condition = Evaluate(i, j, k);
            if (condition) break;
        }
        if (condition) break;
    }
    if (condition) break;
}
Run Code Online (Sandbox Code Playgroud)

问题是每个循环都必须检查该condition标志。我们可以使用 a 对其进行重构,goto使其更加高效并且启动起来更加优雅。

for (int i = 0; i < BigNumber; i++)
{
    for (int j = 0; j < i; j++)
    {
        for (int k = 0; k < j; k++)
        {
            if (Evaluate(i, j, k)) goto BAILOUT;
        }
    }
}
BAILOUT:
Run Code Online (Sandbox Code Playgroud)

  • +1 是 goto 何时是最干净、最可维护的解决方案的绝佳示例。另一个例子是具有许多潜在错误条件的代码,它们都使用 goto 来跳出常见错误出口。 (3认同)

Jar*_*Par 5

C# 中的指令goto并不比任何其他控制流结构慢。事实上,绝大多数控制流结构(if、while、for 等)都是根据goto.

例如:

if (someExpr) { 
  Console.WriteLine("here");
}
Console.WriteLine("there");
Run Code Online (Sandbox Code Playgroud)

基本上编译为以下内容

gotoIf !someExpr theLabel;
Console.WriteLine("here");
theLabel:
Console.WriteLine("there");
Run Code Online (Sandbox Code Playgroud)