我正在研究一個程序,其中速度非常重要,因爲一切都在循環中。我想知道這兩個方程中的哪一個更快執行。在C++中優化一個簡單的執行速度公式
第一個是:
smoothing/(1 + smoothing)
其中smoothing
是const unsigned int
。
第二個是:
1-1/(1+smoothing)
將第一個更快,因爲沒有涉及到的公式在更短的運營商?第二個會更快變成smoothing
是隻叫一次?還有另一個選擇比這兩個更快嗎?
我正在研究一個程序,其中速度非常重要,因爲一切都在循環中。我想知道這兩個方程中的哪一個更快執行。在C++中優化一個簡單的執行速度公式
第一個是:
smoothing/(1 + smoothing)
其中smoothing
是const unsigned int
。
第二個是:
1-1/(1+smoothing)
將第一個更快,因爲沒有涉及到的公式在更短的運營商?第二個會更快變成smoothing
是隻叫一次?還有另一個選擇比這兩個更快嗎?
正如其他人指出的那樣,由於整數算術(無論您可能預期的浮點結果將會丟失),表達式as-is將分別產生0或1。這可以通過在表達式中使用浮點文字(例如smoothing/(1.0f + smoothing)
)來解決,這將產生浮點結果。
除此之外,在這個級別上你不應該過度擔心手動優化。您的編譯器能夠自行優化等效表達式;你的重點應該是寫作你程序員最可讀的東西。
如果你修復了上面提到的浮點問題,gcc 7.2會爲這兩個表達式產生相同的程序集,並且這是優化禁用。所以沒有什麼可擔心的。他們都是「快」。
同樣,如果smoothing
確實是常量,表達式的結果也是常量,並且不需要在循環的每次迭代中重新計算。您可以簡單地聲明另一個常量變量,其值是表達式的結果。
你有沒有嘗試對它們進行計時測試? –
該部門是性能殺手。你能消除或減少分裂的數量嗎? –
表達式不等價。第一個產生0,第二個產生1。首先使代碼正確,然後嘗試測量以找出優化的位置或者是否有必要。 –