总结:我们的软件使用了一个实用功能,这个功能被称为百万次,所以我们必须对它进行优化。我注意到,通过在这个实用程序函数中简单调整我们的代码,执行速度更快,从执行10秒到0.6秒。这是效用函数中的调整:
从code1(在10秒内完成):
double d = (a * x3 + b * y3 + c) / l;
if (std::abs(d) > inMaxDToL) return false;
d = (a * x4 + b * y4 + c) / l;
if (std::abs(d) > inMaxDToL) return false;
return false;
代码2(在0.6秒内完成):
double d = (a * x3 + b * y3 + c) / l;
if (std::abs(d) > inMaxDToL) return false;
return false;
我所做的是在代码2的早期返回false。显然,在第一个代码中,第1 + 2行在工作量方面相当于第3 + 4行。所以我想知道为什么删除第3 + 4行可以加快处理速度呢?
将执行时间从10秒减少到0.6秒的另一个调整是替换incall函数调用:
if (!inBetween(x1, y1, x2, y2, x3, y3)) return false;
及其内容:
if ((x2 - x1) * (x2 - x3) > epsilon) return false;
if ((y2 - y1) * (y2 - y3) > epsilon) return false;
代码也从10秒加速到0.6毫秒。
我正在使用Visual Studio 2013及其编译器。
我在这里错过了什么吗?
编辑:使其更清晰:
答案 0 :(得分:1)
正如this post中写得非常好,我很确定你是分支预测失败的牺牲品。
此外,将第二次操作的结果放在另一个变量中可能是值得的。如果你没有打算返回' d,写入不同的变量可能会让编译器做更多的优化。
答案 1 :(得分:0)
您可以利用延迟评估(短路布尔评估)并在单一条件下进行两项检查,避免将结果分配给变量
// second condition will only evaluate if the first one is false.
if((std::abs((a * x3 + b * y3 + c) / l) > inMaxDToL) ||
(std::abs((a * x4 + b * y4 + c) / l) > inMaxDToL))
return false;