memory_get_usage

Я делаю немного класса сравнительного теста для отображения времени загрузки страницы и использования памяти. Время загрузки уже работает, но когда я отображаю использование памяти, оно не изменяет Пример:

$conns = array();
ob_start();
benchmark::start();
$conns[] = mysql_connect('localhost', 'root', '');
benchmark::stop();
ob_flush();

использует ту же память как

$conns = array();
ob_start();
benchmark::start();
for($i = 0; $i < 1000; $i++)
{
   $conns[] = mysql_connect('localhost', 'root', '');
}
benchmark::stop();
ob_flush();

Я использую memory_get_usage (верный) для получения использования памяти в байтах.

5
задан Gabriel Solomon 9 March 2010 в 15:00
поделиться

4 ответа

Посмотрите:

for($i = 0; $i < 1000; $i++)
{
   $conns[] = mysql_connect('localhost', 'root', '');
}

Вы могли бы зациклиться на 100 000, и ничего бы не изменилось, это то же самое соединение. Для этого не выделяются ресурсы, потому что связанный список, помняющий их, никогда не увеличивался. Зачем ему расти? Уже есть (предположительно) действительный дескриптор в $ conns [0] . Это не повлияет на memory_get_usage (). Вы проверили $ conns [15] , чтобы убедиться, что это работает, да?

Может ли root @ localhost иметь несколько паролей? Нет. Зачем PHP обрабатывать другое соединение только потому, что вы ему это сказали? ( язык в щеку ).

Я предлагаю запустить то же самое через CLI через Valgrind , чтобы увидеть фактическое использование кучи:

valgrind / usr / bin / php -f foo.php .. или что-то подобное. Внизу вы увидите, что было выделено, что было освобождено и сборка мусора в действии.

Заявление об ограничении ответственности: я хорошо разбираюсь во внутренностях PHP, но я не являюсь экспертом в этом преднамеренно запутанном лабиринте, написанном на C, который Zend называет PHP.

2
ответ дан 13 December 2019 в 05:34
поделиться

memory_get_usage (true) покажет объем памяти, выделенной движком php, фактически не используемой скриптом. Вполне возможно, что ваш тестовый сценарий не требовал, чтобы движок запрашивал больше памяти.

Для теста возьмите большой (ish) файл и прочтите его в память. Тогда вы должны увидеть изменение.

Я успешно использовал memory_get_usage (true) для отслеживания использования памяти скриптами веб-сканирования, и он работал нормально (поскольку целью было замедлить работу до достижения предела системной памяти). Единственное, что следует помнить, это то, что он не меняется в зависимости от фактического использования, он изменяется в зависимости от памяти, запрошенной движком. Итак, в конечном итоге вы видите внезапные скачки вместо замедления роста (или сжатия).

Если вы установите для флага real_usage значение false, вы можете увидеть очень небольшие изменения памяти - однако это не поможет вам отслеживать истинный объем памяти, из которого php запрашивает система.

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

8
ответ дан 13 December 2019 в 05:34
поделиться

Я не гуру во внутренних функциях PHP, но я могу себе представить, что echo не влияет на объем памяти, используемой PHP, так как он просто выводит что-то клиенту.

Это может быть по-другому, если вы включите буферизацию вывода.

Следующее должно иметь значение:

$result = null;
benchmark::start()
for($i = 0; $i < 10000; $i++)
{
   $result.='test';
}
2
ответ дан 13 December 2019 в 05:34
поделиться

echo не изменит выделенное количество байтов (если вы не используете выходные буферы).

$i-переменная отменяется после цикла for-loop, поэтому она также не изменяет количество выделенных байтов.

попробуйте использовать пример буферизации вывода:

ob_start();
benchmark::start();
for($i = 0; $i < 10000; $i++)
{
   echo 'test';
}
benchmark::stop();
ob_flush();
0
ответ дан 13 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

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