在c ++ 11中,哪一个更快:max(a-b, b-a)
或abs(a-b)
?
答案 0 :(得分:4)
时间作为指标,实际上仅在变更的背景下有用。在这里,您需要在较短的时间内通过计算寻找变化,但也许最终可能发生的最重要的状态变化在我们自己内部。生活实际上只是体验时间(最终是体验变化),而且往往比我们希望的更短。我们只能在有限的时间内经历如此多的变化,因为有限的时间意味着有限的变化。
所以我建议这里最有效的解决方案是使用分析器,事后看来,在您编写代码之后,您可以直截了当地编写代码(直到您有充分的理由不去)。获取剖析器并养成测量习惯可能是在最短的时间内可以实现的最有效的状态变化,以实现更高效的计算。到目前为止,这将是最有效的解决方案。
以下是Jessica Alba的照片,以说明:
答案 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
是原始数据类型