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

时间:2012-04-19 17:31:13

标签: c# goto

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

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

4 个答案:

答案 0 :(得分:11)

  

比其他流控制结构慢?

没有。无论如何,所有其他流控制结构基本上都是goto

答案 1 :(得分:4)

C#中的goto指令并不比任何其他控制流构造慢。实际上,绝大多数控制流构造(if,while,for等)都是以goto的形式实现的。

例如:

if (someExpr) { 
  Console.WriteLine("here");
}
Console.WriteLine("there");

基本上编译为以下

gotoIf !someExpr theLabel;
Console.WriteLine("here");
theLabel:
Console.WriteLine("there");

答案 2 :(得分:4)

  

我注意到一个公式实现使用了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
            }
        }
    }
}

你可以通过不同的方式摆脱整个事情。这是一种方法。

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

问题是每个循环必须检查condition标志。我们可以使用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:

答案 3 :(得分:1)

iffor由编译器在内部翻译为goto,因此它们不会快于goto s