2010-11-15 52 views
3

這似乎是一個簡單的問題,但是,在任何腳本語言中重新使用變量通常是一個好主意嗎?任何語言:回收變量

我特別感興趣的原因是/不是很好的做法,因爲我除了我自己,如果我應該或不應該這樣做。

例如,$i是在循環中用於遍歷事物的最常用變量之一。

EG(在PHP):

//This script will iterate each entry in $array 
//and output it with a comma if it isn't the last item. 

$i=0; //Recycling $i 

foreach ($array as $v) { 
    $i++; 

    if ($i<count($array)) 
    { 
     echo $v.', '; 
    } 
    else { 
     echo $v; 
    } 
} 

說我有幾個圈在我的劇本,倒不如再利用$i或只使用另一個變量如$a和任何其他循環去從$b$z

顯然要重新使用$i,我必須在循環之前設置$i=0;null,否則在稍後的腳本中會出現一些非常奇怪的行爲。這讓我懷疑是否重用它是值得的麻煩..

下面會佔用更多的空間比只使用另一個變量?

$i=0; //Recycling $i 

當然這的是使用的最簡單的例子,我想知道,如果腳本是非常複雜,它會造成更多的麻煩比它的價值?

我知道重新使用一個變量可以節省很少量的內存,但是當這些變量疊加時,變得很重要,不是嗎?

非常感謝您提供任何直接的答案,如果這個問題過於模糊,我表示抱歉並希望知道這一點,以便我知道我應該在其他地方提出這些問題。

+1

你在說變量,而不是「字符串」。字符串是一系列字節,通常表示字符。 – Santa 2010-11-15 18:58:07

+0

* Facepalm *我的道歉..該帖子已按照編輯。 – Partack 2010-11-15 19:02:43

回答

1

重置變量($ i = 0)不會佔用更多空間。

當你聲明一個變量(比如整數類型)時,爲該整數分配預定義數量的內存,而不管它的值是什麼。通過將其更改回零,您只能修改該值。

如果聲明一個新變量,則必須爲其分配內存,並且通常也會將其初始化爲零,因此重置現有變量可能不會佔用額外的CPU時間。

將索引變量用於互斥循環是一個好主意;它使你的代碼更易於理解。如果你聲明瞭許多額外的變量,其他人閱讀你的代碼可能會懷疑,即使你的循環完成後,「我」仍然被用於某些事情。

重用它! :)

+0

感謝您的回覆。有一件事我想指出的是,每次都不會有額外的代碼重新設置變量來增加腳本的文件大小?通常情況下,這不是一個真正的問題..但是如果你只有幾個kb的工作和一個有很多循環的腳本作爲最壞的情況呢? – Partack 2010-11-15 19:12:38

+1

不要擔心腳本大小。您的腳本不會直接放入內存中。它正在被解釋,並且(取決於你的語言)可能被編譯。你的腳本行正被翻譯成你無法合理預測的一噸字節碼指令。如果你遇到過內存受限的情況,你應該使用低級語言,例如彙編或C語言。 – Brendan 2010-11-15 19:17:45

2

我認爲你有「字符串」與「變量」混淆。字符串是ASCII或Unicode字符的集合,具體取決於編程語言。變量是內存中的命名位置。所以你說的是回收一個變量,而不是一個字符串。

不幸的是,變量處理的方式是高度的語言和編譯器特定的。如果你給我們更多的細節,你會得到更好的信息。

大多數語言都有範圍的概念,在聲明中分配變量空間,在範圍結束時釋放變量空間。如果將變量保留在適當的範圍內,則不必擔心浪費內存,因爲變量在不再需要時會被釋放。再次,範圍的細節是語言相關的。

通常,重複使用變量名稱是個不錯的主意,因爲當你忘記將變量重置爲同一範圍內的某個初始值時,程序將在運行時中斷。

2

在進入您的foreach循環之前,您應該將$i初始化爲0,無論您是否在函數的前面使用它,也不管您使用的是哪種語言。這簡直是​​一種語言中立的最佳實踐。

許多語言通過允許您將計數變量綁定到for循環的範圍來幫助您執行此操作。PHP的foreach提供類似的機制,提供基於0陣列,並且只包含數字鍵:

foreach ($array as $i => $v) { 
    echo $v; 

    if ($i + 1 < count($array)) 
     echo ', '; 
} 

此外,在問候你的語句:

我知道,再利用一個變量可能保存少量的內存,但是當這些變量疊加時,它變得重要,不是嗎?

不,它確實沒有。變量在超出範圍時將被垃圾收集。這實際上是不可能的(沒有以編程方式生成代碼),通過單個函數的過程使用如此多的計數/臨時變量,內存使用情況非常重要。重新使用變量而不是聲明新變量將不會對程序性能產生可衡量的影響,並且幾乎不會影響其內存佔用。

+0

哦,是的..它在循環之前比之後設置更有意義..謝謝=) – Partack 2010-11-15 19:05:29

1

就個人而言,我沒有任何問題重新使用索引/計數器變量 - 儘管在某些語言中,例如.Net,在for循環中使用變量專門將變量作用於該循環 - 因此它被清理後沒有有什麼關係。

你不應該永遠再使用含有任何顯著的數據(這不應該是爲所有的變量應該有描述性的名稱問題)

我曾經嘗試清理一些Excel宏變量由學生編寫的代碼 - 所有變量名都是希臘神,並且在整個劇本中重複使用它們。最後,我只是重新寫了它。

您還應該意識到,根據變量的類型和您使用的語言,重新分配內容可能與創建新變量一樣昂貴。如再次在.NET中,字符串是不可變的所以這...

Dim MyString as String = "Something" 
MyString = "SomethingElse" 

實際上會分配一個新的內存區域來存儲第二使用和改變MyString指針在新的位置點。順便說一句,這就是爲什麼以下效率非常低(至少在英寸。網):

Dim SomeString = SomeVariable & " " & SomeOtherVariable 

這對於SomeVariableSomeVariable + " "然後更多的內存,然後又再次SomeVariable + " " + SomeOtherVariable分配內存 - 這意味着SomeVariable實際寫入內存的3倍。

總之,我會重複使用非常簡單的循環變量。除此之外,我只是分配一個新的變量 - 尤其是因爲內存分配通常只是大部分應用程序的時間/處理的一小部分。

記住:Premature optimization is the root of all evil

+0

非常感謝你的意見,這對我來說很有意義=)我剛剛閱讀唐納德克努特(那個人說的那句話)。多麼偉大的人。我會記得那個! – Partack 2010-11-15 20:09:25

+0

歡迎。我熟悉Knuth,但希望SO Q會更有用:) – Basic 2010-11-15 20:33:45

1

這取決於你要解決的問題。

當使用PHP(以及其他腳本語言)時,應該考慮使用unset()方法設置大小可變的變量,如數組或長字符串。你不應該打擾重新使用或取消設置小變量(整數/布爾/等)。使用(慢速)腳本語言時,這並不值得。

如果您正在開發一個低(低)級語言(如C)的性能關鍵應用程序,那麼變量重用更重要。

+0

謝謝,區分是否回收不同語言之間的變量是我的一個亟待解決的問題 - 你幾乎總結了一些問題=) – Partack 2010-11-15 20:13:06