c++11 中哪个更快:max(a-b, b-a) 或 abs(a-b)?

Which is faster in c++11: max(a-b, b-a) or abs(a-b)?

在 c++11 中,哪个更快:max(a-b, b-a)abs(a-b)

我的猜测:

最大值:

2 substraction: a-b, b-a
1 comparation: a-b>b-a ? a-b : b-a

绝对值:

1 substraction: a-b
1 comparation a-b>0 ? a-b : -(a-b)

与 0 比较比比较两个值更简单

所以我认为 abs 更快,因为 a,b 是原始数据类型

与所有性能相关的问题一样,只有一个真正的答案。 你需要在你的平台上,在你的用例上计时。 不同的 stl 实现也可以以不同的方式实现这些功能,在这种情况下,您的 CPU 架构也起着重要作用。

衡量一下,得出自己的结论。我打赌你不会真正注意到任何显着差异。不过,我对您的用例很好奇,为什么这对您如此重要?

时间作为一种衡量标准,实际上只在变化的情况下才有用。在这里,您正在寻找通过计算在更短时间内发生的变化,但也许最终可能发生的最重要的状态变化是在我们自己内部发生的。人生其实就是体验时间(归根结底是体验变化),它往往比我们希望的要短。我们只能在有限的时间内经历这么多的变化,有限的时间意味着有限的变化。

所以我建议这里最有效的解决方案是使用分析器,事后看来,在你以尽可能简单的方式编写代码之后(直到你有充分的理由不要)。抓住一个分析器并养成测量的习惯可能是最有效的状态变化,可以在最短的时间内发生,以实现更高效的计算。到目前为止,这将是最有效的解决方案。

这里放一张杰西卡·阿尔芭的照片来说明:

您可以使用 godbolt.org,固定链接:https://goo.gl/QmxbDe

#include <algorithm>
#include <cstdlib>

int abs1(int a, int b) {
   return abs(a-b);
}

int abs2(int a, int b) {
  return std::max(a-b, b-a);
}

int abs3(int a, int b) {
 return a > b ? a - b : b - a;
}

int abs4(int a, int b) {
 return a == b ? a : (a > b ? a - b : b - a);
}

clang-3.7 x86 的结果 -O4

abs1(int, int):                              # @abs1(int, int)
    subl    %esi, %edi
    movl    %edi, %eax
    negl    %eax
    cmovll  %edi, %eax
    retq

abs2(int, int):                              # @abs2(int, int)
    movl    %edi, %eax
    subl    %esi, %eax
    subl    %edi, %esi
    cmpl    %esi, %eax
    cmovgel %eax, %esi
    movl    %esi, %eax
    retq

abs3(int, int):                              # @abs3(int, int)
    movl    %esi, %eax
    subl    %edi, %eax
    subl    %esi, %edi
    cmovlel %eax, %edi
    movl    %edi, %eax
    retq

abs4(int, int):                              # @abs4(int, int)
    movl    %edi, %eax
    subl    %esi, %eax
    jne .LBB3_2
    movl    %edi, %eax
    retq
.LBB3_2:
    jg  .LBB3_4
    subl    %edi, %esi
    movl    %esi, %eax
.LBB3_4:
    retq

显然 cstdlib 中的 abs 对于随机数来说会更快。