2012-08-15 36 views
0

我試圖比較內存中使用的常量和變量,但發現了一個奇怪的現象。定義了一個常量但內存沒有變化

測試代碼:

<?php 
var_dump(memory_get_usage()); // int(129100) 
// I don't understand: I don't do someting but why there has the changed 
var_dump(memory_get_usage()); // int(129156) 
var_dump(memory_get_usage()); // int(129156) 

define('hello', 'WORLD'); 
// why here hasn't changed 
var_dump(memory_get_usage()); // int(129156) 

$hello = 'WORLD'; 
var_dump(memory_get_usage()); // int(129304) 
?> 
+0

使用define的行爲與C的#define非常相似,因爲它在評估之前會替換代碼中的值。我假定它將信息存儲在已經分配給解釋器的內存塊中,而不是新的內存塊。 – Matt 2012-08-15 16:14:25

回答

2

第一次看到php_var_dump:PHP有很多內存泄漏。這意味着,它確實在某處分配內存,但不釋放它。所以不要害怕看到這樣的效果。但是,這一次它可能是別的東西:

請看下面的例子:

<?php 

$data = array(0,0,0,0); 
$data[0] = memory_get_usage(); 
$data[1] = memory_get_usage(); 

echo $data[0]; 
echo "\n"; 
echo $data[1]; 
echo "\n"; 

$data[2] = memory_get_usage(); 
echo $data[2]; 
echo "\n"; 
$data[3] = memory_get_usage(); 
echo $data[3]; 
echo "\n"; 

?> 

輸出將是這樣的:

626464 
626464 
626528 
626528 

你看到它第一次調用後變爲「回聲」 ,它必須爲輸出緩衝區分配內存或類似的東西。也許它在內部使用printf(buffer,「...」,...)來生成發送到標準輸出的字符串。這個字符串在以後的調用中被重用,如果需要的話,只調整到更長的緩衝區。

您對var_dump的調用間接使用了echo函數,並且可能還使用了一些內部緩衝區,即在第一次調用時分配的緩衝區。

解決方案:爲了更準確地測量事情,您應該在「測量」之前調用每個輸出函數一次,或者在結果的最終輸出之前不要調用它們。

相關問題