我在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会更快吗?
答案 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);
}
如果第一个条件是true
,else if
条件将不会被评估,而且它本质上已经是goto
。
答案 1 :(得分:0)
在最坏的情况下你会交换一个goto进行三次逻辑条件检查,所以是的 - 这对你来说会慢得多。
话虽如此,我不得不提到InBetween提到的“else if”是解决这个问题的正确方法。看起来比提供相同性能的goto更干净。
答案 2 :(得分:0)
“if if”解决方案很好,但我觉得对“if”如何影响性能存在一些误解。 “if”的实际成本不在逻辑比较中。它是如何影响CPU的分支预测的。分支预测失败会破坏管道并浪费数十个周期。分支预测非常动态,取决于这些逻辑值的稳定性。 因此理论上“goto”和“else if”将比另外的“if”语句更快。但是没人知道多少。它取决于这些逻辑值在运行时如何变化。如果你真的想知道的话,运行一些分析。但是,当您运行分析时,请确保这些值以与实际用例相同的模式更改。