performancec++11hardware

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


In c++11, which one is faster: max(a-b, b-a) or abs(a-b)?


Solution

  • 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.