使用goto语句会比让if语句返回false更快吗?

时间:2016-08-23 12:53:25

标签: c# performance

我在c#中编写了一些非常复杂的实时解析算法,速度是我程序成功的关键。如果我无法在一秒内保留45个更改数据的进程,那么TCP服务器另一端的PID控制循环将振荡。我可以重新调整PID循环以在较慢的" fps"但那是不可能的。只是想到了Ill告诉你,在你写出答案之前说“"差异只有10毫秒,所以没有真正的"因为那些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会更快吗?

3 个答案:

答案 0 :(得分:10)

您根本不需要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

答案 1 :(得分:0)

在最坏的情况下你会交换一个goto进行三次逻辑条件检查,所以是的 - 这对你来说会慢得多。

话虽如此,我不得不提到InBetween提到的“else if”是解决这个问题的正确方法。看起来比提供相同性能的goto更干净。

答案 2 :(得分:0)

“if if”解决方案很好,但我觉得对“if”如何影响性能存在一些误解。 “if”的实际成本不在逻辑比较中。它是如何影响CPU的分支预测的。分支预测失败会破坏管道并浪费数十个周期。分支预测非常动态,取决于这些逻辑值的稳定性。 因此理论上“goto”和“else if”将比另外的“if”语句更快。但是没人知道多少。它取决于这些逻辑值在运行时如何变化。如果你真的想知道的话,运行一些分析。但是,当您运行分析时,请确保这些值以与实际用例相同的模式更改。