2017-09-28 62 views
-1

我正在研究一個程序,其中速度非常重要,因爲一切都在循環中。我想知道這兩個方程中的哪一個更快執行。在C++中優化一個簡單的執行速度公式

第一個是:

smoothing/(1 + smoothing) 

其中smoothingconst unsigned int

第二個是:

1-1/(1+smoothing) 

將第一個更快,因爲沒有涉及到的公式在更短的運營商?第二個會更快變成smoothing是隻叫一次?還有另一個選擇比這兩個更快嗎?

+0

你有沒有嘗試對它們進行計時測試? –

+0

該部門是性能殺手。你能消除或減少分裂的數量嗎? –

+2

表達式不等價。第一個產生0,第二個產生1。首先使代碼正確,然後嘗試測量以找出優化的位置或者是否有必要。 –

回答

1

正如其他人指出的那樣,由於整數算術(無論您可能預期的浮點結果將會丟失),表達式as-is將分別產生0或1。這可以通過在表達式中使用浮點文字(例如smoothing/(1.0f + smoothing))來解決,這將產生浮點結果。

除此之外,在這個級別上你不應該過度擔心手動優化。您的編譯器能夠自行優化等效表達式;你的重點應該是寫作你程序員最可讀的東西。

如果你修復了上面提到的浮點問題,gcc 7.2會爲這兩個表達式產生相同的程序集,並且這是優化禁用。所以沒有什麼可擔心的。他們都是「快」。

同樣,如果smoothing確實是常量,表達式的結果也是常量,並且不需要在循環的每次迭代中重新計算。您可以簡單地聲明另一個常量變量,其值是表達式的結果。