Ну, давай узнаем!
<?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
. Действительно, несколько сотен байтов.