簡體   English   中英

使用goto語句會比讓if語句返回false更快嗎?

[英]Would using a goto statement be faster than letting an if statement return false?

我在c#中寫了一些非常復雜的實時解析算法,速度是我程序成功的關鍵。 如果我無法在一秒內保留45個更改數據的進程,那么TCP服務器另一端的PID控制循環將振盪。 我可以重新調整PID循環以慢速“fps”運行,但這是不可能的。 只是想到Ill告訴你,在你寫出答案之前說“差異只有10ms所以沒有真正的東西”因為那些10ms對我來說很重要。

如果使用這樣的goto語句會更快。

if (GeneralDataDirection && UseMaxCandleData || GeneralDataDirection && !UseMaxCandleData)
            {
                Y1 = CandleStickWorkingData.Min();
                X1 = Array.IndexOf(CandleStickWorkingData, Y1);
                goto FirstPointCalculated;
            }

if (!GeneralDataDirection && UseMaxCandleData || !GeneralDataDirection && !UseMaxCandleData)
            {
                Y1 = CandleStickWorkingData.Max();
                X1 = Array.IndexOf(CandleStickWorkingData, Y1);
            }

FirstPointCalculated:

或者從第一個if子句中刪除goto語句並讓第二個if子句返回false會更快嗎?

您根本不需要goto ,只需使用else if

if (GeneralDataDirection && UseMaxCandleData || GeneralDataDirection && !UseMaxCandleData)
{
     Y1 = CandleStickWorkingData.Min();
     X1 = Array.IndexOf(CandleStickWorkingData, Y1);
}
else if (!GeneralDataDirection && UseMaxCandleData || !GeneralDataDirection && !UseMaxCandleData)
{
     Y1 = CandleStickWorkingData.Max();
     X1 = Array.IndexOf(CandleStickWorkingData, Y1);
}

如果第一個條件為trueelse if條件不會被評估,那么它本質上就是一個goto

在最壞的情況下,你會交換一個goto進行三次邏輯條件檢查,所以是的 - 這對你來說會慢得多。

話雖如此,我不得不提到InBetween提到的“else if”是解決這個問題的正確方法。 看起來比提供相同性能的goto更干凈。

“else if”解決方案很好,但我覺得對“if”如何影響性能存在一些誤解。 “if”的實際成本不在邏輯比較中。 它是如何影響CPU的分支預測的。 分支預測失敗會破壞管道並浪費數十個周期。 分支預測非常動態,取決於這些邏輯值的穩定性。 因此理論上“goto”和“else if”將比另外的“if”語句更快。 但是沒人知道多少。 它取決於這些邏輯值在運行時如何變化。 如果你真的想知道的話,運行一些分析。 但是,當您運行分析時,請確保這些值以與實際用例相同的模式更改。

暫無
暫無

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

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