2012-08-25 18 views
1

首先,我很抱歉如果這只是一個編碼風格問題。我想知道爲每個屬性或函數分配一個新變量的優缺點,以重新分配一個現有的變量。假設你不需要訪問超出範圍的變量。指定新變量與重新使用現有指標的優缺點

這裏就是我的意思(注意,該名稱$var0,...只是爲了簡單), 選項#1:

$var0= array('hello', 'world'); 
$var1="hello world"; 
$var2=//some crazy large database query result 
$var3=//some complicated function() 

與 選項#2:

$var0= array('hello', 'world'); 
$var0="hello world"; 
$var0=//some crazy large database query result 
$var0=//some complicated function() 
  1. 它取決於現有變量的內存大小?也就是說,重新分配內存的計算量更大,分配一個新的變量?
  2. 這是否始終是範圍問題,這意味着只有當您不需要這裏顯示的範圍之外的每個變量值時,才應該使用選項#2?
  3. 它取決於每個變量值是什麼?重新分配給不同的數據類型有不同的相關成本嗎?
+2

[早熟優化...](http://c2.com/cgi/wiki?PrematureOptimization) –

+1

使用新/重新使用退出變量對代碼的性能沒有可衡量的影響。在思考如何命名變量時重點關注是錯誤的。這不是如何進行優化......如果您擔心無法量化的週期數量,您將會以這種或那種方式進行存儲,您將錯過實際重要的優化,比如選擇正確的算法。 – meagar

+1

在你的例子中,'$ var2 = //一些瘋狂的大型數據庫查詢結果':在這個語句中,「瘋狂的大型數據庫查詢」比爲一個新變量分配空間要貴上萬倍。這絕對不是與優化軟件相關的東西。優化變量分配花費的時間不會花費5分鐘來優化大型查詢。 – meagar

回答

3

就我個人而言,我會說你永遠不應該重新分配一個變量來包含不同的東西。這使得它很難調試。如果你擔心內存消耗,你總是可以使用unset()變量。

另請注意,您永遠不應該有變量名稱$var#。你的變量名應該描述它的含義。

在這一天結束的時候,最重要的是儘量減少代碼中的WTF數量。而選項二是一個大的WTF。

它取決於現有變量的內存大小嗎?也就是說,重新分配內存的計算量更大,分配一個新的變量?

這是關於限制你和其他人(重新)查看你的代碼的跆拳道的數量。

這是否始終是一個範圍問題,這意味着只有在您不需要這裏顯示的範圍之外的每個變量值時,您才應該使用選項#2?

那麼,如果它在一個完全的其他範圍內,它是好的,如果你使用相同的名稱多個名稱。只要是清楚的variabel包含,例如:

// perfectly fine to use the same name again. I would go as far as to say this is prefered. 
function doSomethingWithText($articleText) 
{ 
    // do something 
} 

$articleText = 'Some text of some article'; 
doSomethingWithText($articleText); 

是否取決於每個變量的值是什麼?重新分配給不同的數據類型有不同的相關成本嗎?

不是成本問題,而是可維護性問題。這通常更重要。

+0

- @ PeeHaa,謝謝,您的意見是關於限制程序員的困惑。假設兩種情況都沒有混淆,是否重新分配更好? –

+2

您應該考慮的*唯一的事情是您是否引入混淆。如果你忽略了混淆,那麼這兩種方法都不是「更好」。重用變量沒有優化。這是在PHP中構建軟件時擔心的絕對錯誤的事情。使您的代碼可維護。如果在編寫代碼之後發現其中的部分內容很慢,請優化它們。不*優化他們通過重用變量名稱,這不是一個優化。 – meagar

+1

如果你是在談論表演,我不得不說:不要去想它。我真的懷疑這是否重要。即使您在應用程序中遇到性能問題,它幾乎也不會成爲瓶頸。 – PeeHaa

3

你應該從來沒有使用選項#2。對不相關的代碼塊重用變量是一種可怕的做法。你甚至不應該處於可能有選項#2的情況。如果你的函數太長以至於你完全改變了上下文並且處理了一些不同的問題,那麼你應該將你的函數重構爲更小的單一用途函數。

你應該從來沒有重複使用一個變量出於一些願望,以便在舊值不再使用後「回收」它們。如果一個變量不再適用,如果你正確地構建你的軟件,它自然會超出範圍。你的決定應該與性能或內存優化無關,這兩者都不會受到變量命名的影響。選擇變量名稱時唯一的考慮因素應該是生成可維護,穩定的代碼。

事實上,你甚至問自己是否重用你的變量意味着你使用的名稱太泛化了。像var0var1等變量名稱是糟糕的。您應該根據它們實際包含的內容命名變量,並在需要存儲新值時聲明新變量。

5

從技術上講,重用變量會(不顯着)更快。儘管如此,它將在可衡量的表現上實現零差。

儘管硬件越來越便宜,而且數小時也變得越來越昂貴,您應該更願意擁有可維護的代碼。從長遠來看,這將爲你自己節省頭痛和貴公司的資金。

只有在可以獲得足夠的性能收益以抵消所投入的工作量(金錢)的情況下才能進行優化。

如今雲和服務器集羣,一個位不太優化的代碼將最有可能作出最終較慢的項目。您的項目運行速度可能會更快,但會花費更多的CPU週期,因此您的託管服務提供商將花費更多的錢。儘管如此,這個小額增加的成本很可能不會考慮幾個小時的性能增益優化。當然,除非你正在問這個,因爲你正在爲亞馬遜開發。 (甚至在像亞馬遜這樣的地方,每天點擊數百萬和數百萬點擊,重複使用變量不會導致任何明顯的性能增益)

回到您的問題;我相信你只應該重用一個變量,當它將保存原始狀態的更新內容。但總的來說,這並不會發生太多。

我認爲,在下列情況下,重用$content變種是合乎邏輯的選擇,使

function getContent() 
{ 
    $cacheId = 'someUniqueCacheIdSoItDoesNotTriggerANotice'; 
    $content = someCacheLoadingCall($cacheId); 

    if (null === $content) { 
     $content = someContentGeneratingFunction(); 

     someCacheSavingCall($cacheId, $content); 
    } 

    return $content; 
} 

描述代碼

另外,請善待你的未來的自己總是使用描述您的變量的名稱。你會爲此感謝你。當你與自己達成協議時,除非從邏輯上講有意義,否則不會重用變量,你已經向可維護代碼邁出了又一步。

想象一下,從現在起6個月內,在完成另一個大型項目或更小的項目之後,您會收到一位重要客戶的電話,指出舊項目中存在一個錯誤。聖!@#!現在就解決這個問題! 你開放,看到這樣的功能無處不在;

function gC() 
{ 
    $cI = 'someUniqueCacheIdSoItDoesNotTriggerANotice'; 
    $c = sclc($cI); 

    if (null === $c) { 
     $c = scg_f(); 
     scsc($cI, $c); 
    } 

    return $c; 
} 

好得多使用描述變量和函數名,並獲得一個代碼編輯器良好代碼完成,所以你還在編碼一樣快,你想要的。現在,我會推薦Aptana StudioZend Studio,Zend的代碼更好一點,但Aptana已經證明更穩定。

PS。我不知道你的編程水平,對不起,如果我嘮叨太多。如果與你無關,我希望能幫助其他人閱讀此:) :)

+0

- @ Maurice,感謝真實世界的例子 –

+2

我希望我可以兩次投票「優化增益與工作的關係」。如此多的浪費時間花在了這種非優化上...... – meagar