2016-07-07 111 views
1

我有一個關於優化代碼速度的快速問題。函數的運算速度

返回函數中的double值還是指向double值作爲參數之一是否更快?

返回雙

double multiply(double x,double y) { 
    return x * y; 
} 

指針參數

void multiply(double x,double y,double *xy) { 
    *xy = x * y; 
} 
+3

您是否嘗試過分析您的代碼? – dbush

+0

http://norvig.com/21-days.html(有價值的閱讀材料)以與答案相關的「答案表」結尾。 –

+2

如果不涉及其他因素,我會選擇第一個實現方便。無論假設忽略不計的性能差異。 –

回答

4

你在這裏談論選決定的通常被稱爲microoptimization - 你是通過使微小的優化代碼改變而不是重新思考該計劃的總體戰略。通常情況下,「微觀優化」具有「以不太明顯的方式重寫某些東西的意圖,其目的是擠出更多的性能」。語言將數據從函數中傳遞出來的顯式方式是通過返回值,而程序員習慣於看到原始類型的數據,所以如果您要「脫離腳本」並使用像這樣的outparameter,應該有一個好的有理由這樣做。

您是否完全確定此代碼執行頻率很高,以至於值得考慮重寫,這會使得爲了提高效率而難以閱讀?一個好的優化編譯器可能會內聯這個函數調用,所以很可能沒有多少成本。爲了確保重寫代碼是值得的,你應該首先運行一個分析器並獲取有力的證據,證明這個特定的代碼確實是一個瓶頸。

一旦您收集到證據顯示這實際上會減慢您的程序速度,請採取措施並詢問 - 您爲什麼要進行如此多的乘法運算?您可能會問,是否有可以使用的算法需要更少的乘法運算,而不是進行微觀優化。這些變化更可能導致性能提升。最後,如果你確定這是瓶頸,並且你確定沒有辦法擺脫乘法,那麼你應該問這個改變是否會做任何事情。爲此,找出答案的唯一方法就是進行變更並衡量差異。這種改變非常小,大多數優秀的編譯器都足夠聰明,可以實現你正在做的事情並相應地進行優化。結果,如果你真的在這裏看到性能提升,我會感到驚訝。

總結:

  • 可讀性比效率,作爲一個起點,它使用「正確」的語言特性的工作是值得這麼多更有價值。最初使用return語句。

  • 如果您有硬性具體的證據證明您擁有的功能是瓶頸,請查看您是否真的需要多次調用該函數,方法是尋找優化代碼的更大方法。

  • 如果您絕對需要多次調用該函數,然後進行更改並查看它是否可行 - 但不要指望它實際上會產生變化,因爲更改較小,並且優化編譯器是智能的。