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

本文关键字:语句 false 返回 if goto 使用 | 更新日期: 2023-09-27 18:03:31

我正在用c#编写一些非常复杂的实时分析算法,速度是我的程序成功的关键。如果我无法保持45个进程的变化数据一秒钟,那么在TCP服务器的另一端的PID控制回路将振荡。我可以重新调整PID循环以较慢的"fps"运行,但这是不可能的。我只是想告诉你,在你写下"差异只有10毫秒,所以没有什么"的答案之前,因为这10毫秒对我来说很长。

使用这样的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语句会比让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);
}

如果第一个条件是true,则else if条件不会被求值,它实质上已经是goto了。

在最坏的情况下,您将用三个逻辑条件检查来交换一个goto,所以是的-这对您来说会相当慢。

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

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