2015-10-09 3 views
4

Есть ли разница в производительности при использованииРазница в производительности с помощью std :: min или trernary operator?

a = a <= b ? a : b; 

против

a = std::min(a, b); 

В коде, где я работаю используется первая форма, но имена переменных достаточно длинны, что делает его трудно читать. Я бы предпочел использовать второй, но не уверен, есть ли разница в производительности.

+4

Пытался тестирования сами? – MrTux

+0

Разница будет крошечной, особенно если ваш компилятор знает, как скомпилировать встроенные функции. Невозможно рассказать, не зная, в какой среде вы строите/за. Не стоит беспокоиться. –

+0

Вы можете быть уверены, что при включении всех оптимизаций 'std :: min' довольно эффективен. Эти микро-оптимизации обычно не являются узким местом в программе. – vsoftco

ответ

8

Идите для ясности в отношении преждевременной оптимизации.

Даже если есть разница в производительности между двумя версиями [*], это будет иметь значение только в том случае, если эта линия является частью узкого места производительности: прочитайте на Amdahl's Law.

[*] Маловероятно, что в любом случае будет ощутимая разница в производительности. Если вы действительно хотите знать, единственный способ убедиться в этом - построить некоторые репрезентативные тесты, построив их с помощью вашей инструментальной цепочки и запуская их в вашей целевой архитектуре.

1

Здесь вы должны провести анализ производительности. Но вы, вероятно, не найдете никакой разницы, так как оба оператора, вероятно, будут генерировать точный код (если смотреть на сгенерированный код сборки может помочь - с g++, скомпилируйте с помощью -S).

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 так быстро, как это добирается. Микрооптимизация обычно не является узким местом в программе.

+0

Письменная версия, вероятно, пройдет и вернется по значению, что было бы проще оптимизировать. –

+0

@AlanStokes И будет также немного более безопасным, поскольку, если вы выполняете 'const int & x = min (n + 1, n-1);', вы получаете ссылку на свисание. – vsoftco

+0

@vsoftco Не временно ли продлевается срок службы «х» в этом случае? –

8

Я тестировал его с помощью gcc-O2, и оба производили ту же самую сборку. Нет никакой разницы.

0

В обоих лязгом и НКУ (с включенной оптимизации), они производят один и тот же узел:

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

проверить его https://godbolt.org/g/eWsJl9

Смежные вопросы