2017-03-17 78 views
-5

摘要:我们的软件使用了一个实用程序功能,该功能被称为百万次,因此我们必须优化它。我注意到,通过在这个效用函数中简单地调整我们的代码,执行速度从执行的10秒降低到0.6秒。下面是在实用功能的好办法:即使它不应该显示较慢的代码

从编码1(在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秒finised):

double d = (a * x3 + b * y3 + c)/l; 
if (std::abs(d) > inMaxDToL) return false; 

return false; 

我所做的就是返回在代码2中较早出现错误。显然,在第一个代码中,第1 + 2行相当于第3 + 4行的工作负载。所以我想知道为什么删除3 + 4行可以加速处理这么多?

也减少来自10S执行时间0.6秒另一个TWEAK是取代的门店函数调用:

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; 

该代码也从加速10s到0.6ms。

我正在使用Visual Studio 2013及其编译器。

我在这里错过了什么吗?

编辑:以使其更清晰:

  1. 这几行只是一个效用函数的一部分
  2. 我刻意的为了调试目的
+12

好像两者可以被优化到只有'返回false;'因为没有副作用,所有的情况最终都是'false'。 – aschepler

+0

不能说关于Visual Studio,但在Linux上,您可以使用某种类型的操作生成SIMD指令。 – user902384

+0

当你说秒时,你确定不是指毫秒吗?我看不出这些例子中的任何一个可能会花费超过100毫秒。 – klutt

回答

1

由于疯狂写得很好的this post返回false ,我敢肯定你是分支预测失败的受害者。

另外,将第二个操作的结果放在另一个变量中也许值得。如果你不打算返回'd',写入不同的变量可能会让编译器做更多的优化。

+0

真棒,谢谢@亚历克斯! –

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; 
相关问题