2011-04-19 54 views
6

我經常在我的web應用程序中使用函數sizeof($var),我想知道是否更好(在資源方面)將此值存儲在新變量中並使用此變量,或者如果最好每次調用/使用功能;或者可能無動於衷:)每次調用函數還是將該值存儲在新變量中都更好?

+1

更好地使用功能每次 – diEcho 2011-04-19 13:26:08

+1

@diEcho:作出回答,而不是評論 – 2011-04-19 15:04:27

+0

我已經編輯我的答案下面的測試 - 我認爲這是你在找什麼。 – Dave 2011-04-19 15:13:37

回答

3

我跑這個小陣列的循環方面的一些測試:

$myArray = array("bill", "dave", "alex", "tom", "fred", "smith", "etc", "etc", "etc"); 

// A) 
for($i=0; $i<10000; $i++) { 
    echo sizeof($myArray); 
} 

// B) 
$sizeof = sizeof($myArray); 
for($i=0; $i<10000; $i++) { 
    echo $sizeof; 
} 

隨着9項的數組:

A) took 0.0085 seconds 
B) took 0.0049 seconds 

以180項的數組:

A) took 0.0078 seconds 
B) took 0.0043 seconds 

隨着3600件物品的排列:

A) took 0.5-0.6 seconds 
B) took 0.35-0.5 seconds 

儘管沒有太大差別,但可以看到隨着數組的增長,差異變得越來越大。我認爲這讓我重新思考我的觀點,並從現在開始說,我將設置變量預循環。

Storing a PHP integer takes 68 bytes of memory.這是一個足夠小的數量,我想我寧願處理時間比內存空間。

+0

嚴正,它也取決於你將使用多少變量或調用函數!謝謝:) – markzzz 2011-04-19 16:42:18

+1

@markzzz - 當然 - 我無法回答你的問題,但無限數量的可能性。 – Dave 2011-04-19 17:35:51

1

如果您一遍又一遍地調用函數,最好將此信息保存在一個變量中。這樣服務器不必處理答案,它只是查找它。但是,如果結果可能改變,最好繼續運行該功能。

+2

還值得注意的是,作爲最佳實踐,這裏存在可伸縮性問題。由於過多的函數調用,軟件的每次運行可能只會遭受毫秒級的性能低下,但如果您的應用程序開始被數百萬人使用,則這些毫秒會變成秒,分鐘和數小時的服務器處理時間。 – 2011-04-19 13:34:55

+0

那麼對於變量的存儲是不是會一樣呢?無論哪種方式 - 你會去處理器使用或內存空間。我的假設是,當你接觸到數以百萬計的人時,你會繼續增加更多的硬件,這會影響這些差異 - y/n? – Dave 2011-04-19 13:43:29

+0

我只是覺得這是一個很好的做法。如果到達結果需要幾百行來處理,甚至是數據庫調用,那麼將結果存儲在變量中是一個非常好的主意。既然這顯然是真的,爲什麼不把它作爲你的標準實踐,即使對於較小的功能? – 2011-04-19 13:46:45

0

除非您將此功能調用一百萬次,否則您的「性能提升」將可以忽略不計。

0

我不認爲它真的很重要。從某種意義上說,你不想一次又一次地做同樣的事情,但考慮到它是sizeof();,除非它是一個巨大的數組,否則你應該沒問題。

3

通常,最好將可能重複的函數的結果賦值給變量。

在你建議的例子中,這種方法產生的處理代碼和替代方法(反覆調用函數)的區別是微不足道的。但是,如果涉及的功能更復雜,最好避免重複執行。

例如:

for($i=0; $i<10000; $i++) { 
    echo date('Y-m-d'); 
} 

執行我的服務器上0.225273秒,而:

$date = date('Y-m-d'); 

for($i=0; $i<10000; $i++) { 
    echo $date; 
} 

執行0.134742秒。我知道這些片段並不完全相同,但您明白了。很多用戶在很多月份或幾年內加載很多頁面,即使是這種大小的差異也可能很大。如果我們要使用一些複雜的功能,可以引入嚴重的可伸縮性問題。

不將一個返回值分配給一個變量的主要優點是你需要少一行代碼。在PHP中,我們可以經常在同一時間調用我們的功能做我們的任務:

$sql = "SELECT..."; 

if(!$query = mysql_query($sql))... 

...雖然這有時鼓勵可讀性原因。

在我看來,爲了保持一致性,將返回值分配給變量是一種更好的方法,即使在執行簡單函數時也是如此。

0

我認爲,你應該避免同樣的結構:

for ($i = 0; $i < sizeof($array), $i += 1) { 
    // do stuff 
} 

爲,將的sizeof執行每一次迭代,即使它往往是不太可能改變。

而在結構是這樣的:

while(sizeof($array) > 0) { 
    if ($someCondition) { 
     $entry = array_pop($array); 
    } 
} 

你往往別無選擇,只能計算它的每一個迭代。

1

由於您分配了一個新的變量,這會佔用更多的內存。但它可能會讓你的代碼更快一點。

它帶來的麻煩可能很大。例如,如果您包含另一個應用相同技巧的文件,並將這些文件的大小存儲在var $sizeof中,則可能會發生不良情況。奇怪的錯誤,發生在你不期望的時候。或者你忘記在你的功能中添加global $sizeof

有很多可能的錯誤,你介紹什麼?由於速度增益可能無法衡量,我認爲這不值得。

相關問題