C++ 代码速度明显较慢,即使它不应如此

C++ 代码速度明显较慢,即使它不应如此,c++,optimization,time,C++,Optimization,Time,小结:我们的软件使用了一个实用函数,这个函数被调用了数百万次,所以我们必须对它进行优化。我注意到,通过简单地调整这个实用程序函数中的代码,执行速度要快得多,从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::ab

小结:我们的软件使用了一个实用函数,这个函数被调用了数百万次,所以我们必须对它进行优化。我注意到,通过简单地调整这个实用程序函数中的代码,执行速度要快得多,从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;
要在0.6秒内完成代码2:

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;
代码的速度也从10s提高到了0.6ms

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

我错过什么了吗

编辑:为使其更清晰:

这几行只是效用函数的一部分 出于调试目的,我故意返回false
我相信你是分支预测失败的受害者


此外,将第二次操作的结果放在另一个变量中也是值得的。如果您不打算返回“d”,则写入不同的变量可能会允许编译器进行更多优化。

您可以利用延迟求值短路布尔求值,并在单个条件下进行两次检查,避免将结果分配给变量

// 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;

似乎两者都可以优化到只返回false;因为没有副作用,所有情况都以false结束。不能说Visual Studio,但在Linux上,您可以通过某种类型的操作生成SIMD指令。a第一个条件几乎总是正确的,b x4,y4在缓存中是冷的吗?抱歉,我不清楚:1。10秒和0.6秒时,运行百万次2。这几行只是效用函数3的一部分。为了调试,我特意返回false。如果你发布了整个实用程序函数,你会得到更好的答案,因为这就是你正在计时的。太棒了,谢谢@AlexG!