使用std :: min或三元运算符的性能差异?

时间:2015-10-09 21:59:02

标签: c++ c++11

使用

是否有任何性能差异
MyUserResponseMessage

a = a <= b ? a : b;

在我工作的代码中使用了第一个表单,但变量名很长,这使得它很难阅读。我宁愿使用第二种,但不确定是否存在任何性能差异。

5 个答案:

答案 0 :(得分:9)

我用gcc -O2测试了它,两者都产生了完全相同的组件。没有任何区别。

答案 1 :(得分:7)

明确过早优化。

即使两个版本[*]之间存在性能差异,只有这一行是整体性能瓶颈的一部分才有意义:阅读Amdahl's Law

[*]无论如何,不​​太可能出现明显的性能差异。如果您真的非常想知道,唯一可以找到的方法是构建一些有代表性的基准测试,使用工具链构建它们并在目标架构上运行它们。

答案 2 :(得分:2)

这是我的标准库实现(gcc5)的样子:

template<typename _Tp>
    _GLIBCXX14_CONSTEXPR
    inline const _Tp&
    min(const _Tp& __a, const _Tp& __b)
    {
      // concept requirements
      __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
      //return __b < __a ? __b : __a;
      if (__b < __a)
    return __b;
      return __a;
    }

因此,在内联此函数时,并且启用了所有优化后,std::min的代码就会快得多。微优化通常不是程序的瓶颈。

答案 3 :(得分:1)

这是您需要进行一些性能分析的地方。但是,您可能没有发现任何区别,因为这两个语句可能会生成完全相同的代码(查看生成的汇编代码可以帮助 - 使用g++,使用-S进行编译)。

答案 4 :(得分:0)

在clang和gcc(启用了优化)中,它们生成相同的程序集:

    cmp     esi, edi
    cmovle  edi, esi
    mov     eax, edi

检查出来 https://godbolt.org/g/eWsJl9