2016-09-23 67 views
1

問題很簡單 - 檢查給函數的實際參數是否會導致性能損失?實際參數檢查性能影響

導出的庫函數通常傾向於以檢查用戶代碼傳遞的實際參數:

if (arg1 == NULL || arg2 == NULL) 
    return -EINVAL; 

這是否檢查性能產生負面影響?我嘗試通過從某些導出的函數中刪除這些檢查來優化某些庫代碼(依賴於我是一個行爲良好的用戶並始終傳遞有效參數),但我注意到沒有真正的改進。

我的第一個猜測是現代處理器上的分支預測會假設if分支沒有被採用,並且繼續執行代碼而沒有真正的懲罰。如果這確實是原因 - 這種分支預測機制的侷限性是什麼?是否有消除這些檢查會提高性能的情況?在C這樣的本地編譯語言和解釋或VM語言(如Python和Java)之間如何變化?

順便說一句 - 我意識到檢查運行時參數的重要性。我只對性能方面感興趣。

+0

您需要廣泛地標定這種事情才能真正知道。沒有明確的答案。另外,查看Linux內核的'__likely'和'__unlikely'宏。 –

+0

您可能會發現[this](http://stackoverflow.com/a/11227902/2681632)有趣。 –

+0

一個更好的問題是檢查'NULL'的參數是否有用。有*豐富*非'NULL'指針,不能傳遞給期望有效輸入的函數。一個'assert()'可能更合理。 – EOF

回答

1

如果參數檢查與值比較一樣簡單,則刪除此檢查所帶來的性能改進很小。如果任何檢查比較複雜,比如檢查一個數組的所有項或者調用其他函數來檢查每個參數,那麼你可能會看到性能有所改進。

在任何編寫良好的庫中,這種參數檢查不應該浪費時間。如果您試圖找到影響開發的瓶頸,您應該對代碼的執行進行基準測試/剖析,以確定「哪一行代碼/函數」需要更多時間來執行,並專注於改進它們。