考慮這個腳本:
$arr = array();
for ($i = 0; $i < 100000; $i++) $arr[] = null;
echo memory_get_usage() . "\n";
這在我的機器上輸出:21687696,也就是21 MB使用的內存。另一方面使用這個:
$master_null = null;
$arr = array();
for ($i = 0; $i < 100000; $i++) $arr[] = $master_null;
echo memory_get_usage() . "\n";
輸出:13686832,這是13 MB。根據這些信息,您可以假設您的內存使用情況值得關注,實際上使用「master null」變量實際上更好。但是,您仍然需要擁有數組中的所有項目,並且HashTable中的每個條目(數組的內部表示形式)都需要一些內存。
如果您想深入瞭解zvals和參考資料,我建議您使用功能debug_zval_dump
。利用它,你可以看到,哪些變量共享相同的zval:
$a = $b = $c = $d = "abc";
debug_zval_dump($a);
$x = $y = $z = $w = null;
debug_zval_dump($x);
$q = null;
debug_zval_dump($q);
,輸出:
string(3) "abc" refcount(5)
NULL refcount(5)
NULL refcount(2)
這意味着,儘管變量$ x和$ q都是NULL,他們不是同樣的zval。但$ x和$ y共享相同的zval,因爲它們是相互分配的。我相信你知道功能debug_zval_dump
,但如果不知道,請確保您仔細閱讀http://php.net/manual/en/function.debug-zval-dump.php的引用解釋。
同樣在我的文章結尾處,我想說這些信息可能對更好地瞭解PHP內部有用,我認爲做任何優化都是無用的。主要是因爲開始優化腳本的地方比這樣的微優化要好得多。此外,雖然這不是規範的一部分,但PHP作者可能會在將來更改此行爲(例如,所有NULL變量可能在未來版本中共享相同的zval)。
爲什麼不試試呢?看起來很簡單。 – Halcyon 2012-04-21 15:32:30
@Frits:我不知道如何確定腳本中存在哪些zvals。 PHP在每種情況下的行爲都是相同的;隱藏的內部差異來自用戶。 – Hammerite 2012-04-21 15:53:30
但有效的記憶屬性不會被隱藏起來。這是你想知道的嗎? – Halcyon 2012-04-21 16:04:11