А вот Memory... что-то я сомневаюсь, что она врет. Здесь подсчитывается, сколько памяти было выделено во время выполнения скрипта. И в эту обертку попадают как все телодвижения, так и все определения функций, классов и прочее.
Нет, это не так - и Вы видели это на примере, который сами же и привели. Такой способ не учтёт ничего, что определено внутри окружения функций/методов
Я имел ввиду свой код. У меня в самом начале index.php определены стартовые переменные времени и памяти
Время определять так не стоит - потому что даже для всего скрипта оно будет незначащим, ведь однократное применение не даёт верного значения (тем более если речь идёт о веб-сайте, где приложение работает со многими сторонними ресурсами, порождая случайные сетевые задержки, например).
Память (Memory) - не имеет смысла, поскольку не отразит того, что делается уровнем ниже глобального.
Только "максимальная память" (Max Memory) имеет некий смысл, так как отразит максимально потреблённую память. Однако для полной картины это нужно собирать в статистических таблицах, поскольку если веб-сайт, например, работает с БД, то результат может быть разным в зависимости от её выборки и т.п.
То есть если я этим кодом обернул сайт, то в итоге получаю погодные виджеты?
Не понял, о чём Вы
Hapson пишет:
А как тогда быть с памятью, если нужно измерить потребление целого скрипта
Для измерения памяти, которая была потреблена всем скриптом, целиком - вполне подойдёт memory_get_peak_usage(). Для измерения того, сколько памяти потребила конкретная функция - нет. Подумайте, зачем это нужно? А именно:
- Измерили память, потреблённую всем скриптом. Оказалось, что слишком много
- Что делать дальше? Измерять, сколько памяти потребляет конкретный участок кода (будь то функция или что-либо ещё). И вот здесь уже не помогут ни memory_get_usage() ни memory_get_peak_usage()
- Разумной альтернативой будет использовать профилировщик (и для задачи, которую Вы озвучили, это - наиболее правильное решение, поскольку только профилировщик предоставит точные данные)
Это то, что касается того, где может пригодиться возможность измерения памяти, потреблённой конкретным участком кода. Класс в данной теме предназначен для сравнительного анализа, его нельзя использовать для точных измерений, поскольку есть определённые ресурсы, которые он потребит для служебных целей. Однако, тем не менее, используя его, можно вполне достоверно узнать, что "функция X потребила на Z% больше/меньше памяти, чем функция Y" - а так же оценить порядок потребления памяти (но не абсолютно точное значение)
Даже на Вашем примере видно, что память (поле Memory) измеряется некорректно. Она не может составлять менее 4*10.000 байт, Ваш же результат - 0.18Kb (=180 байт). И это понятно, почему - см. второй пункт в моём предыдущем сообщении.
Насчёт максимальной памяти - см. третий пункт, почему нельзя использовать memory_get_peak_usage() для определения этого (а так же код в моём примере)
- Время нельзя измерить одной итерацией. Как уже сказано выше, для этого требуется как минимум 1E6 повторений
- "Память" (Memory) измерена неверно, так как в глобальном контексте переменная внутри функции foo() не будет учтена, однако там строка длиной 4*1E4 байт
- "Максимальная память" (Max Memory) измерена неверно, так как до старта теста есть контекст, который использует больше памяти, чем тестируемая функция.
В Вашем случае и тот код, что Вы привели - не нужен, поскольку верным инструментом будет профилировщик. Кроме того, Вы никогда не сможете таким способом измерить память.
Вообще, измерение памяти для моих задач было весьма критичным моментом. При этом дело сводилось зачастую к таким вещам, как проверка копирования/передачи по ссылке. При этом использовать внешний профилировщик было неудобно из-за большого объема мелких правок при оптимизации.
Кроме того, данный инструмент успешно использовался для измерений используемого файлового пространства для функций, оперирующих с ФС. Насчёт времени - это верно. Как правило, 1E6 - минимальный порог определения достоверности измерения.
esterio
Это разные измерения и потому они проводятся разными методами. Однако же ничто не мешает измерить время, затем память и после этого через array_merge() собрать всё в один массив (именно по этой причине флаги значений в классе сделаны различными)
Представляю вашему вниманию простой инструмент, который предоставляет возможность тестировать функции - чтобы измерить время их исполнения/потребляемую память. Так же существует возможность определять собственную функцию для измерения, однако она, разумеется, должна возвращать числовые значения.
Следует понимать, что инструмент предназначен для сравнительных измерений. Иначе говоря, есть две (или больше) функции и требуется понять, насколько первая лучше/хуже второй. Для этого данный инструмент и будет полезен. Он не предназначен для получения точных (абсолютных) значений используемой памяти/времени, так как использует много внутренних преобразований и вызовов, что служит причиной пусть и небольшой, но неточности.