代码明显较慢,即使它不应该

时间:2017-03-17 14:53:53

标签: c++ optimization time

总结:我们的软件使用了一个实用功能,这个功能被称为百万次,所以我们必须对它进行优化。我注意到,通过在这个实用程序函数中简单调整我们的代码,执行速度更快,从执行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及其编译器。

我在这里错过了什么吗?

编辑:使其更清晰:

  1. 这几行只是效用函数的一部分
  2. 出于调试目的,我故意返回false

2 个答案:

答案 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;