簡體   English   中英

Goto語句在C#中運行緩慢嗎?

[英]Is the goto statement slow in c#?

我正在研究一個C#.NET應用程序,該應用程序對大型數據集(平均1000萬個數據點)使用一些相當復雜的科學公式。 我正在做的部分工作要求盡可能優化公式的實現。

我注意到一個公式實現使用goto,這讓我感到奇怪:goto是否比其他流控制構造慢?

goto比其他流控制構造慢嗎?

不會。其他所有流控制構造基本上都是goto

C#中的goto指令不比任何其他控制流構造慢。 實際上,絕大多數控制流構造(如果,則、、等)都是根據goto

例如:

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

基本上編譯為以下內容

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

我注意到一個公式實現使用goto,這讓我感到奇怪:goto是否比其他流控制構造慢?

goto速度不會比任何其他流控制機制慢。 像大多數流控制機制一樣,它被編譯成一個br.s (或類似的)MSIL指令。 但是,在某些情況下goto可能會稍快一些。 它們主要限於涉及使用break和在嵌套循環內continue 考慮下面的代碼。

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:

if s和for由編譯器在內部轉換為goto ,則它們的速度不會比goto

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM