是否有使用使用std :: min或ternary運算符的性能差異?
a = a <= b ? a : b;
任何性能差異
a = std::min(a, b);
在代碼中,我的工作是使用第一種形式,但變量名是很長,這使得它難以閱讀。我寧願使用第二個,但不確定是否有任何性能差異。
是否有使用使用std :: min或ternary運算符的性能差異?
a = a <= b ? a : b;
任何性能差異
a = std::min(a, b);
在代碼中,我的工作是使用第一種形式,但變量名是很長,這使得它難以閱讀。我寧願使用第二個,但不確定是否有任何性能差異。
爲了澄清過早優化。
即使兩個版本[*]之間存在性能差異,只要該線是整體性能瓶頸的一部分即可:請參閱Amdahl's Law。
[*]無論如何不可能會有明顯的性能差異。如果你確實想知道,唯一可以肯定的方法是構建一些有代表性的基準測試,使用工具鏈構建它們並在目標架構上運行它們。
這是你需要做一些性能分析的地方。但是,您可能會發現沒有區別,因爲這兩個語句可能會生成完全相同的代碼(查看生成的彙編代碼可以幫助您 - g++
,編譯-S
)。
這是我的標準庫實現(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
的代碼是一樣快,因爲它得到。微優化通常不是程序中的瓶頸。
手寫的版本可能會通過並返回值,這將更容易優化。 –
@AlanStokes並且也會稍微安全些,因爲如果你使用'const int&x = min(n + 1,n-1);',你會得到一個懸掛參考。 – vsoftco
@vsoftco在這種情況下,暫時不會將其生命期延長到'x'的壽命期嗎? –
我用gcc -O2測試了它,兩者都產生了完全相同的程序集。完全沒有區別。
在這兩個鐺和gcc(啓用優化),它們產生相同的組件:
cmp esi, edi
cmovle edi, esi
mov eax, edi
嘗試過自己測試它? – MrTux
差異將會很小,特別是如果您的編譯器知道如何編譯內聯函數。沒有確切知道你正在建造什麼樣的環境,無法判斷。不值得擔心。 –
你可以肯定的是,開啓所有優化之後,std :: min是非常有效的。這些微觀優化通常不是程序中的瓶頸。 – vsoftco