Мне было интересно, когда PHP освобождает память, которая используется для переменных
например
function foo(){ $foo = 'data'; return $foo; // <- is the memory space for `$foo` emptied at this point? }
это медленнее, чем:
function foo(){ return 'data'; }
?
Ну, давайте узнаем!
<?php $checkpoints = array( 'start' => memory_get_usage() ); $checkpoints['before defining demo1'] = memory_get_usage(); function demo1() { $foo = 'data'; return $foo; } $checkpoints['after defining demo1'] = memory_get_usage(); $checkpoints['before defining demo2'] = memory_get_usage(); function demo2() { return 'data'; } $checkpoints['after defining demo2'] = memory_get_usage(); $checkpoints['before calling demo1'] = memory_get_usage(); demo1(); $checkpoints['after calling demo1'] = memory_get_usage(); $checkpoints['before calling demo2'] = memory_get_usage(); demo2(); $checkpoints['after calling demo2'] = memory_get_usage(); $checkpoints['before calling demo1 with storage'] = memory_get_usage(); $storage1 = demo1(); $checkpoints['after calling demo1 with storage'] = memory_get_usage(); $checkpoints['before calling demo2 with storage'] = memory_get_usage(); $storage2 = demo2(); $checkpoints['after calling demo2 with storage'] = memory_get_usage(); echo '<pre>'; print_r($checkpoints); $last_key = 'start'; foreach($checkpoints as $key => $value) { echo "{$key} - {$last_key} = ", ($value - $checkpoints[$last_key]), "\n"; $last_key = $key; }
В PHP 5.3.6 мой вывод:
Array ( [start] => 321920 [before defining demo1] => 322188 [after defining demo1] => 322788 [before defining demo2] => 322880 [after defining demo2] => 323188 [before calling demo1] => 323280 [after calling demo1] => 323368 [before calling demo2] => 323464 [after calling demo2] => 323552 [before calling demo1 with storage] => 323692 [after calling demo1 with storage] => 323896 [before calling demo2 with storage] => 324000 [after calling demo2 with storage] => 324204 )
а потом
start - start = 0 before defining demo1 - start = 268 after defining demo1 - before defining demo1 = 600 before defining demo2 - after defining demo1 = 92 after defining demo2 - before defining demo2 = 308 before calling demo1 - after defining demo2 = 92 after calling demo1 - before calling demo1 = 88 before calling demo2 - after calling demo1 = 96 after calling demo2 - before calling demo2 = 88 before calling demo1 with storage - after calling demo2 = 140 after calling demo1 with storage - before calling demo1 with storage = 204 before calling demo2 with storage - after calling demo1 with storage = 104 after calling demo2 with storage - before calling demo2 with storage = 204
Весьма вероятно, что увеличение памяти во время начальных вызовов demo1
и demo2
которые отбрасывают вывод, связано с созданием переменных для хранения памяти.
Тем не менее, нижняя строка здесь – это два примера хранения, в которых как возврат данных напрямую, так и назначение его переменной перед возвратом привели к тому же точному использованию памяти для данных .
Вывод: PHP кажется достаточно уменшим в этом простом тесте, чтобы не переписывать строковые переменные без необходимости, хотя следите за разностью использования памяти между двумя функциями. Просто объявление функции demo1
заняло больше памяти, объявляя demo2
. На самом деле это несколько сотен байт.