Как определить объем потребляемой памяти (размер) переменной?

Существует ли функция в PHP (или расширение PHP) для обнаружения, сколько памяти данная переменная использует? sizeof просто говорит мне количество элементов/свойств.

memory_get_usage помогает в этом, это дает мне емкость памяти, используемую целым сценарием. Существует ли способ сделать это для единственной переменной?

Обратите внимание, что это находится на машине разработки, таким образом загружение расширений или отладчиков выполнимо.

101
задан Piskvor cc-by-sa 3.0 14 December 2015 в 11:32
поделиться

4 ответа

Нет прямого способа получить использование памяти одной переменной, но, как предложил Гордон, вы можете использовать memory_get_usage . Это вернет общий объем выделенной памяти, поэтому вы можете использовать обходной путь и измерить использование до и после, чтобы получить использование одной переменной. Это немного взломано, но должно работать.

$start_memory = memory_get_usage();
$foo = "Some variable";
echo memory_get_usage() - $start_memory;

Обратите внимание, что это никоим образом не является надежным методом, вы не можете быть уверены, что ничто другое не затрагивает память при присвоении переменной, поэтому его следует использовать только как приближение.

Фактически вы можете превратить это в функцию, создав копию переменной внутри функции и измерив используемую память. Не тестировал это, но в принципе не вижу в этом ничего плохого:

function sizeofvar($var) {
    $start_memory = memory_get_usage();
    $tmp = unserialize(serialize($var));
    return memory_get_usage() - $start_memory;
}
92
ответ дан 24 November 2019 в 04:41
поделиться

Нет, нет. Но вы можете сериализовать($var) и проверить strlen результата на аппроксимацию.

24
ответ дан 24 November 2019 в 04:41
поделиться

См .:

Обратите внимание, что это не тем не менее, дать вам использование памяти определенной переменной. Но вы можете вызывать эти функции до и после присвоения переменной, а затем сравнивать значения. Это должно дать вам представление об используемой памяти.

Вы также можете взглянуть на расширение PECL Memtrack , хотя документации немного не хватает, если не сказать, практически не существует.

4
ответ дан 24 November 2019 в 04:41
поделиться

Никогда не пробовал, но трассировки Xdebug с помощью xdebug.collect_assignment может быть достаточно.

1
ответ дан 24 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: