我正在研究一個C#.NET應用程序,該應用程序在大型數據集上使用了一些相當複雜的科學公式(平均爲1000萬個數據點)。我所做的一部分工作要求儘可能優化公式實現。C#中的goto語句慢了嗎?
我注意到一個公式實現使用goto,這讓我想知道:轉到比其他流控制結構慢嗎?
我正在研究一個C#.NET應用程序,該應用程序在大型數據集上使用了一些相當複雜的科學公式(平均爲1000萬個數據點)。我所做的一部分工作要求儘可能優化公式實現。C#中的goto語句慢了嗎?
我注意到一個公式實現使用goto,這讓我想知道:轉到比其他流控制結構慢嗎?
C#中的goto
指令不比任何其他控制流構造慢。事實上,絕大多數控制流構造(如果,等等等等)是按照goto
來實現的。
例如:
if (someExpr) {
Console.WriteLine("here");
}
Console.WriteLine("there");
基本上編譯成以下
gotoIf !someExpr theLabel;
Console.WriteLine("here");
theLabel:
Console.WriteLine("there");
if
S和for
是由編譯器轉換爲內部goto
S左右,他們並不比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:
+1是當goto是最乾淨,最易維護的解決方案的最佳例子。另一個例子是有許多潛在錯誤條件的代碼,它們都使用goto來救助一個常見的錯誤退出。 – 2012-04-23 17:45:07
請自己幫忙,不要在C#中使用goto! – MUG4N 2012-04-19 17:33:34
@ MUG4N goto's沒有什麼錯,它是你如何使用它們使他們變得邪惡的 – GETah 2012-04-19 17:36:09
@GETah它們很少被負責任地使用,而且在替代品上使用它們的價值很小,那麼爲什麼要冒這些風險呢? – Servy 2012-04-19 17:36:57