Memory get peak usage: примеры (PHP)

Использование memory_get_peak_usage для анализа потребления памяти в PHP
Раздел: Информация о PHP
memory_get_peak_usage(bool $real_usage = false): int
Основные сведения о memory_get_peak_usage()

Функция memory_get_peak_usage() в PHP возвращает максимальный объем памяти в байтах, который был выделен скрипту на момент вызова. Эта информация полезна для профилирования и оптимизации потребления памяти в приложениях.

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

Аргументы функции
  • $real_usage (bool) - необязательный параметр. По умолчанию false. При значении true возвращается реальный объем памяти, выделенный системой. При false возвращается память, зарегистрированная внутренним менеджером памяти PHP (emalloc).
Базовые примеры использования
Вызов без параметров

Получение пикового использования памяти в байтах.

<?php
// Выполняем некоторые операции
$array = range(1, 100000);
echo memory_get_peak_usage();
23654400
С параметром true

Получение реального объема выделенной системой памяти.

<?php
$data = str_repeat('x', 1024*1024);
echo memory_get_peak_usage(true);
2097152
Форматированный вывод

Преобразование байтов в удобочитаемый вид.

<?php
function formatBytes($bytes) {
    $units = ['B', 'KB', 'MB', 'GB'];
    $i = 0;
    while ($bytes >= 1024 && $i < count($units)-1) {
        $bytes /= 1024;
        $i++;
    }
    return round($bytes, 2) . ' ' . $units[$i];
}

$peak = memory_get_peak_usage();
echo 'Пиковое использование: ' . formatBytes($peak);
Пиковое использование: 22.56 MB
Похожие функции в PHP
  • memory_get_usage() - возвращает текущее потребление памяти, а не пиковое. Подходит для точечных замеров в процессе выполнения скрипта.
  • memory_limit - директива конфигурации, устанавливающая максимальный лимит памяти для скрипта. Контролирует предел, а не измеряет использование.

Функцию memory_get_peak_usage() предпочтительнее использовать для анализа максимальной нагрузки на память за все время выполнения. Для мониторинга памяти в конкретный момент больше подходит memory_get_usage().

Аналоги в других языках

Memory get peak usage в Python

Модуль resource или tracemalloc для отслеживания использования памяти.

import tracemalloc
tracemalloc.start()
# Код программы
data = [x**2 for x in range(100000)]
current, peak = tracemalloc.get_traced_memory()
print(f"Пиковое использование: {peak / 1024:.2f} KB")
tracemalloc.stop()
Пиковое использование: 3510.05 KB
JavaScript (Node.js)

Использование объекта process.memoryUsage().

const used = process.memoryUsage();
console.log(`Пиковое использование RSS: ${used.rss / 1024 / 1024} MB`);
console.log(`Пиковое использование Heap: ${used.heapUsed / 1024 / 1024} MB`);
Пиковое использование RSS: 22.43 MB
Пиковое использование Heap: 15.21 MB

Memory get peak usage в MySQL

В MySQL нет прямой аналогии, но можно мониторить использование памяти сервером через системные переменные или команду SHOW STATUS.

SHOW STATUS LIKE 'Max_used_memory';
Распространенные ошибки
Некорректная интерпретация результата

Забывают, что результат возвращается в байтах, а не мегабайтах.

<?php
// Ошибка: вывод без форматирования
$peak = memory_get_peak_usage();
echo "Пиковая память: $peak"; // Выведет большое число
Пиковая память: 16777216
Непонимание параметра $real_usage

Разница между значениями при разных параметрах может быть существенной.

<?php
$array = array_fill(0, 10000, 'test');
echo 'С false: ' . memory_get_peak_usage(false) . "\n";
echo 'С true: ' . memory_get_peak_usage(true);
С false: 2097152
С true: 2097152
Изменения в версиях PHP

В PHP 8.0.0 функция была изменена для возврата целого числа (int) вместо целого числа в строке (string) на 32-битных системах. В PHP 5.2.0 был добавлен необязательный параметр $real_usage. В более ранних версиях функция всегда возвращала память, выделенную emalloc.

Расширенные примеры
Сравнение двух алгоритмов
Пример php
<?php
function algorithm1($n) {
    $result = [];
    for ($i = 0; $i < $n; $i++) {
        $result[$i] = $i * $i;
    }
    return $result;
}

function algorithm2($n) {
    $result = new SplFixedArray($n);
    for ($i = 0; $i < $n; $i++) {
        $result[$i] = $i * $i;
    }
    return $result;
}

$n = 100000;
memory_get_peak_usage(true); // Сброс пика
algorithm1($n);
$peak1 = memory_get_peak_usage(true);

memory_get_peak_usage(true); // Сброс пика
algorithm2($n);
$peak2 = memory_get_peak_usage(true);

echo "Алгоритм 1: $peak1 байт\n";
echo "Алгоритм 2: $peak2 байт";
Алгоритм 1: 16777216 байт
Алгоритм 2: 12582912 байт
Мониторинг памяти в цикле
Пример php
<?php
$peaks = [];
for ($i = 0; $i < 5; $i++) {
    $array = range(1, 10000 * ($i + 1));
    $peaks[$i] = memory_get_peak_usage(true);
    unset($array); // Освобождение памяти
}
print_r($peaks);
Array
(
    [0] => 2097152
    [1] => 4194304
    [2] => 6291456
    [3] => 8388608
    [4] => 10485760
)
Использование в сочетании с регистрацией использования
Пример php
<?php
class MemoryTracker {
    private static $startPeak;
    
    public static function start() {
        self::$startPeak = memory_get_peak_usage(true);
    }
    
    public static function getDiff() {
        return memory_get_peak_usage(true) - self::$startPeak;
    }
}

MemoryTracker::start();
$bigArray = array_fill(0, 50000, 'data');
$diff = MemoryTracker::getDiff();
echo "Память выросла на: $diff байт";
Память выросла на: 10485760 байт

PHP memory_get_peak_usage function comments

En
Memory get peak usage Returns the peak of memory allocated by PHP