2015-10-09 74 views
4

是否有使用使用std :: min或ternary運算符的性能差異?

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在這種情況下,暫時不會將其生命期延長到'x'的壽命期嗎? –

8

我用gcc -O2測試了它,兩者都產生了完全相同的程序集。完全沒有區別。

相關問題