PHP memory_get_usage - PullRequest
       1

PHP memory_get_usage

7 голосов
/ 25 октября 2010

Я сталкивался с PHP memory_get_usage() и memory_get_peak_usage().

. Проблема в том, что я обнаружил, что эти две функции не обеспечивают реальную память, используемую текущим скриптом.Мой тестовый скрипт:

<?php

echo memory_get_usage();

echo '<br />';

$a = str_repeat('hello', 100000);

echo '<br />';

echo memory_get_usage();

echo '<br />';

echo memory_get_peak_usage();

?>

, который возвращает:

355120

5355216

5356008

Что вы понимаете из этого?

Первое значение перед выполнением str_repeat(), поэтому оно должно быть значением 0.

Второе - после процесса, и его значение может быть больше0 но не такое большое значение.

Третье - это "пиковое" значение, и оно немного больше второго, так как я думаю, что оно должно быть самым большим значением в микросекунде обработки.

Как вы думаете, реальное значение потребления памяти текущим скриптом должно быть таким:

memory_usage = the second memory usage - the first memory usage

peak_memory_usage = the third (peak_usage) - the first memory usage

, что дает:

1) 5355216 - 355120 = 5000096 байт

2) 5356008 - 355120 = 5000888 байт

Если это так, я предполагаю, что первые 355120 байт - это вся выделенная система память, используемая apache и другими модулями, поскольку первое значение никогда не изменяетсяпри увеличении или уменьшении количества повторений в тон str_repeat(), только два значения после процесса увеличиваются или уменьшаются, но никогда не становятся меньше первого значения.

Ответы [ 3 ]

7 голосов
/ 25 октября 2010

Хорошо, ваше первое утверждение, что first memory_get_usage () должно быть 0, неверно.Согласно документации PHP:

Возвращает объем памяти, в байтах, который в настоящее время выделяется для вашего скрипта PHP.

Ваш скрипт выполняется, поэтому он должен иметь некоторая выделенная ему память.Первый вызов информирует вас о том, сколько это стоит.

Ваше второе утверждение, что str_repeat () не должен использовать столько памяти, не смотрит на всю картинку.

У вас есть строка "привет"(который использует 5 байтов) повторяется 100 000 раз, всего 500 000 байтов ... минимум.Вопрос в том, как PHP выполнял это действие?Использовали ли они такой код?(псевдокод):

s = ""
for(i=0; i<100000; i++)
    s += "hello"

Этот код потребует перераспределения новой строки для каждой итерации цикла for.Теперь я не могу притворяться, что говорю, что знаю, как PHP реализует str_repeat (), но вы должны быть предельно осторожны с тем, как вы используете память, чтобы уменьшить использование памяти.По внешнему виду, они не управляли памятью в этой функции так, как могли бы.

В-третьих, разница между пиковым использованием памяти и текущим использованием памяти, вероятно, связана со стеком, который был необходим для созданиявызов функции str_repeat (), а также любые локальные переменные, необходимые в этой функции.Память, вероятно, была возвращена, когда функция вернулась.

Наконец, Apache работает в другом процессе, и мы имеем дело с виртуальной памятью.Ничто из того, что делает Apache, не повлияет на результат memory_get_usage (), поскольку процессы не «разделяют» виртуальную память.

6 голосов
/ 25 октября 2010

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

2 голосов
/ 25 октября 2010

В моем случае (PHP 5.3.3 на Mac OS X 10.5) ваш скрипт печатает:

323964

824176

824980

Теперь, разница между вторым измерением и первым дает 500212, что очень близко к длине "привет" (5) раз 100000. Так что я бы сказал, что здесь нет сюрпризов. Пик немного больше из-за некоторых временных распределений при оценке этих операторов.

(на другие ваши вопросы уже даны ответы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...