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

时间:2015-11-19 15:06:02

标签: performance c++11 hardware

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

4 个答案:

答案 0 :(得分:4)

时间作为指标,实际上仅在变更的背景下有用。在这里,您需要在较短的时间内通过计算寻找变化,但也许最终可能发生的最重要的状态变化在我们自己内部。生活实际上只是体验时间(最终是体验变化),而且往往比我们希望的更短。我们只能在有限的时间内经历如此多的变化,因为有限的时间意味着有限的变化。

所以我建议这里最有效的解决方案是使用分析器,事后看来,在您编写代码之后,您可以直截了当地编写代码(直到您有充分的理由不去)。获取剖析器并养成测量习惯可能是在最短的时间内可以实现的最有效的状态变化,以实现更高效的计算。到目前为止,这将是最有效的解决方案。

以下是Jessica Alba的照片,以说明:

enter image description here

答案 1 :(得分:4)

您可以使用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

显然,来自abs的{​​{1}}对于随机数字会更快。

答案 2 :(得分:3)

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

测量它,得出你自己的结论。我打赌你不会发现任何重大差异。我对你的用例感到好奇,为什么这对你这么重要?

答案 3 :(得分:1)

我的猜测:

最大:

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

ABS:

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

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

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