Memory get peak usage: примеры (PHP)
memory_get_peak_usage(bool $real_usage = false): intФункция memory_get_peak_usage() в PHP возвращает максимальный объем памяти в байтах, который был выделен скрипту на момент вызова. Эта информация полезна для профилирования и оптимизации потребления памяти в приложениях.
Обычно функцию применяют для отслеживания пикового использования памяти в критических участках кода, при отладке утечек памяти или для сравнения эффективности разных алгоритмов.
- $real_usage (bool) - необязательный параметр. По умолчанию
false. При значенииtrueвозвращается реальный объем памяти, выделенный системой. Приfalseвозвращается память, зарегистрированная внутренним менеджером памяти PHP (emalloc).
Получение пикового использования памяти в байтах.
<?php
// Выполняем некоторые операции
$array = range(1, 100000);
echo memory_get_peak_usage();23654400
Получение реального объема выделенной системой памяти.
<?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
- 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
Использование объекта 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
Разница между значениями при разных параметрах может быть существенной.
<?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 8.0.0 функция была изменена для возврата целого числа (int) вместо целого числа в строке (string) на 32-битных системах. В PHP 5.2.0 был добавлен необязательный параметр $real_usage. В более ранних версиях функция всегда возвращала память, выделенную emalloc.
<?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
$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
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 байт