與空檢查相比,變量賦值是否昂貴?例如,是否值得檢查foo在賦值爲空之前是否爲空?在分配給null之前檢查變量null是否爲空?
if (foo != null) {
foo = null;
}
或者這是無所謂?
與空檢查相比,變量賦值是否昂貴?例如,是否值得檢查foo在賦值爲空之前是否爲空?在分配給null之前檢查變量null是否爲空?
if (foo != null) {
foo = null;
}
或者這是無所謂?
這是一個微型微型優化(可能由編譯器負責處理)。不要擔心。專注於您的程序實際算法,您將獲得更大的回報。
我們應該忘記小的效率,說約97%的時間:過早的優化是所有罪惡的根源。 - Donald Knuth
由於差異基本爲零,哪一個更清楚?隨着支票或沒有? – Albert 2009-02-24 20:43:41
沒有檢查。 – 2009-02-24 20:45:54
@mike,你是對的。但是,我們是不是偏離這裏的實際問題? 問題是哪個更有效。但我們正在談論我們如何不應該花太多時間在小事上。那就是我們正在談論的良好實踐,而不是問題的答案! – 2009-02-25 04:46:40
這實際上(非常非常輕微)較少高效。變量賦值大致相當於空檢查,再加上可能的額外分支。並不是說它有很大的不同。
或者這是否令人擔憂?
你明白了。
我不擔心它 - 這只是額外的代碼行來維護。這是一種微不足道的優化,除非您有證據證明這是您的瓶頸,否則不應該這樣做。
foo = null;
if (foo != null)
foo = null;
如果我看的第二塊代碼,我會認爲你只是想設置foo的變量設置爲null,如果它之前是不爲空,如果我看的第一個代碼,我覺得你想把變量foo設置爲空。
我知道這是因爲你寫的例子,但最終這種微型優化只會增加混淆(這是不值得的)。
這會讓你的代碼難以閱讀,即使它是一種優化,也不值得麻煩。
而且這不是一個優化。在大多數現代CPU的if語句是非常昂貴的。
這樣做很少或沒有影響。我不認爲你甚至可以創建一個基準來證明這種差異。
事實上,有人會說,分配給所有null是一個代碼味道(見PMD detector for NullAssignment):
分配一個「空」到一個變量 (其聲明之外)是 通常不好的形式。有時, 分配表示 程序員不完全知道 代碼中發生了什麼。注意:這種分配 在極少數情況下可能對 有用,鼓勵垃圾收集。如果 這就是你使用的是什麼它,通過 一切手段,無視這個規則:-)
一般情況下,我個人持懷疑態度的任何企圖,以鼓勵垃圾收集(你幾乎總是得到效果你沒有想到)。
首先,它是微觀優化。所以不需要太擔心。
但要回答你的問題,你需要把它減少到只有一行。 (因爲你所有的代碼都是將它設置爲NULL)。
foo = NULL;
原因在於,
比較是一個比分配非常非常昂貴的操作。 (由於比較會比較消耗很多彙編指令,通常是減法和比較爲零或XOR並與零比較)。分配佔用較少的指令。
如果你有一個體面的編譯器,他們將生成相同的代碼。如果你有一個蹩腳的編譯器,if
將會更糟糕。在2009年,對變量的硬件分配非常便宜,而有條件的分支有時可能很昂貴。
我很喜歡這個問題,因爲我認爲所有答案中的(一致)信息都很重要。恕我直言,Knuth如下引用是絕對正確的。即使這個比例下降了3%,只有堅實的分析和基準測試才能給出明確的答案。 – RBerteig 2009-02-24 20:58:09
我猜一致的答案也表明我得到了非常明顯的錯誤... – Albert 2009-02-24 21:09:12