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
对于随机数来说会更快。
在 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
对于随机数来说会更快。