2009-02-24 135 views
6

與空檢查相比,變量賦值是否昂貴?例如,是否值得檢查foo在賦值爲空之前是否爲空?在分配給null之前檢​​查變量null是否爲空?

if (foo != null) { 
    foo = null; 
} 

或者這是無所謂?

+0

我很喜歡這個問題,因爲我認爲所有答案中的(一致)信息都很重要。恕我直言,Knuth如下引用是絕對正確的。即使這個比例下降了3%,只有堅實的分析和基準測試才能給出明確的答案。 – RBerteig 2009-02-24 20:58:09

+0

我猜一致的答案也表明我得到了非常明顯的錯誤... – Albert 2009-02-24 21:09:12

回答

30

這是一個微型微型優化(可能由編譯器負責處理)。不要擔心。專注於您的程序實際算法,您將獲得更大的回報。

我們應該忘記小的效率,說約97%的時間:過早的優化是所有罪惡的根源。 - Donald Knuth

+0

由於差異基本爲零,哪一個更清楚?隨着支票或沒有? – Albert 2009-02-24 20:43:41

+0

沒有檢查。 – 2009-02-24 20:45:54

+0

@mike,你是對的。但是,我們是不是偏離這裏的實際問題? 問題是哪個更有效。但我們正在談論我們如何不應該花太多時間在小事上。那就是我們正在談論的良好實踐,而不是問題的答案! – 2009-02-25 04:46:40

7

這實際上(非常非常輕微)較少高效。變量賦值大致相當於空檢查,再加上可能的額外分支。並不是說它有很大的不同。

或者這是否令人擔憂?

你明白了。

3

我不擔心它 - 這只是額外的代碼行來維護。這是一種微不足道的優化,除非您有證據證明這是您的瓶頸,否則不應該這樣做。

1

foo = null; 

if (foo != null) 
    foo = null; 

如果我看的第二塊代碼,我會認爲你只是想設置foo的變量設置爲null,如果它之前是不爲空,如果我看的第一個代碼,我覺得你想把變量foo設置爲空。

我知道這是因爲你寫的例子,但最終這種微型優化只會增加混淆(這是不值得的)。

1

這會讓你的代碼難以閱讀,即使它是一種優化,也不值得麻煩。

而且這不是一個優化。在大多數現代CPU的if語句是非常昂貴的。

1

這樣做很少或沒有影響。我不認爲你甚至可以創建一個基準來證明這種差異。

事實上,有人會說,分配給所有null是一個代碼味道(見PMD detector for NullAssignment):

分配一個「空」到一個變量 (其聲明之外)是 通常不好的形式。有時, 分配表示 程序員不完全知道 代碼中發生了什麼。注意:這種分配 在極少數情況下可能對 有用,鼓勵垃圾收集。如果 這就是你使用的是什麼它,通過 一切手段,無視這個規則:-)

一般情況下,我個人持懷疑態度的任何企圖,以鼓勵垃圾收集(你幾乎總是得到效果你沒有想到)。

2

首先,它是微觀優化。所以不需要太擔心。

但要回答你的問題,你需要把它減少到只有一行。 (因爲你所有的代碼都是將它設置爲NULL)。

foo = NULL; 

原因在於,

比較是一個比分配非常非常昂貴的操作。 (由於比較會比較消耗很多彙編指令,通常是減法和比較爲零或XOR並與零比較)。分配佔用較少的指令。

2

如果你有一個體面的編譯器,他們將生成相同的代碼。如果你有一個蹩腳的編譯器,if將會更糟糕。在2009年,對變量的硬件分配非常便宜,而有條件的分支有時可能很昂貴。