8

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

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

4

4 回答 4

12

goto 比其他流控制结构慢吗?

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

于 2012-04-19T17:32:02.817 回答
4

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

有不同的方法可以让你摆脱整个事情。这是一种方法。

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标志。我们可以用 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:
于 2012-04-23T16:01:45.197 回答
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");
于 2012-04-19T17:32:47.153 回答
1

ifs并由编译器在内部for翻译为gotos,因此它们不比gotos快

于 2012-04-19T17:32:49.687 回答