2012-04-19 100 views
8

我正在研究一個C#.NET應用程序,該應用程序在大型數據集上使用了一些相當複雜的科學公式(平均爲1000萬個數據點)。我所做的一部分工作要求儘可能優化公式實現。C#中的goto語句慢了嗎?

我注意到一個公式實現使用goto,這讓我想知道:轉到比其他流控制結構慢嗎?

+4

請自己幫忙,不要在C#中使用goto! – MUG4N 2012-04-19 17:33:34

+3

@ MUG4N goto's沒有什麼錯,它是你如何使用它們使他們變得邪惡的 – GETah 2012-04-19 17:36:09

+0

@GETah它們很少被負責任地使用,而且在替代品上使用它們的價值很小,那麼爲什麼要冒這些風險呢? – Servy 2012-04-19 17:36:57

回答

11

轉得比其他流量控制結構慢嗎?

不管怎樣,所有其他的流程控制結構基本上都是goto

+0

謝謝。 不確定爲什麼有人標記我的問題。 – kevin628 2012-04-19 17:33:41

+3

這是一個完全合理的問題。當人們看到與goto相關的事情時,人們會發出內心的反應。 – jason 2012-04-19 18:34:25

4

C#中的goto指令不比任何其他控制流構造慢。事實上,絕大多數控制流構造(如果,等等等等)是按照goto來實現的。

例如:

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

基本上編譯成以下

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

if S和for是由編譯器轉換爲內部goto S左右,他們並不比goto小號

最快
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: 
+2

+1是當goto是最乾淨,最易維護的解決方案的最佳例子。另一個例子是有許多潛在錯誤條件的代碼,它們都使用goto來救助一個常見的錯誤退出。 – 2012-04-23 17:45:07