In c++11, which one is faster: max(a-b, b-a)
or abs(a-b)
?
You can use godbolt.org
#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);
}
Result for clang-3.7 x86 with -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
Obviously abs
from cstdlib
will be faster for random numbers.