Memory get usage: примеры (PHP)
memory_get_usage(bool $real_usage = false): intФункция memory_get_usage() возвращает объем памяти в байтах, который выделен для работы текущего скрипта PHP. Она используется для профилирования, отладки и оптимизации кода, помогая находить участки с высоким потреблением памяти.
- $real_usage (bool) — необязательный параметр. По умолчанию
false.- Если
false, функция возвращает память, выделенную системой для скрипта. - Если
true, возвращается реальный объем памяти, используемый в данный момент. Установка значенияtrueможет замедлить выполнение.
- Если
$memory = memory_get_usage();
echo "Использовано памяти: $memory байт\n";
echo "Использовано памяти: " . round($memory / 1024 / 1024, 2) . " МБ\n";Использовано памяти: 2097152 байт Использовано памяти: 2 МБ
$memory_system = memory_get_usage(false);
$memory_real = memory_get_usage(true);
echo "Системная: $memory_system, Реальная: $memory_real\n";Системная: 2097152, Реальная: 1835008
Функция memory_get_peak_usage() возвращает пиковое значение объема памяти, выделенное для скрипта за время его выполнения. Полезно для анализа максимальных требований.
Директива memory_limit в php.ini задает максимальный объем памяти для скрипта. Функция ini_get('memory_limit') возвращает текущее значение этого лимита.
memory_get_usage применяют для точечного замера в процессе работы. memory_get_peak_usage используют для общего анализа после выполнения или в его конце.
Memory get usage в Python
Модуль resource или psutil.
import resource
mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
print(f"Память: {mem} КБ")Память: 12345 КБ
Используют объект process.memoryUsage().
const mem = process.memoryUsage();
console.log(`RSS: ${mem.rss} байт`);RSS: 52355072 байт
PHP функция возвращает целое число байт для текущего скрипта. В Node.js метод возвращает объект с разными видами памяти. В Python данные часто предоставляются в килобайтах.
// Ошибка: сравнение без учета типа данных или контекста.
$mem = memory_get_usage();
if ($mem > 100) {
echo "Памяти много!"; // 100 байт - ничтожно мало.
}// В цикле это создает нагрузку.
for ($i = 0; $i < 10000; $i++) {
$mem = memory_get_usage(true); // Избегают такого в продакшене.
}$memStart = memory_get_usage();
// ... код ...
$memEnd = memory_get_usage();
echo "Разница: " . ($memEnd - $memStart) . " байт\n";В PHP 8.0 не было значительных изменений для memory_get_usage(). В PHP 5.2 и более ранних версиях поведение могло отличаться в деталях выделения памяти. Начиная с PHP 5.2, параметр $real_usage ведет себя более предсказуемо. В PHP 7 и 8 оптимизации в ядре могли влиять на возвращаемые значения в сторону большей точности.
echo "Начало: " . memory_get_usage() . "\n";
$data = [];
for ($i = 0; $i < 10000; $i++) {
$data[] = str_repeat('a', 1000);
if ($i % 1000 == 0) {
echo "Шаг $i: " . memory_get_usage() . "\n";
}
}
unset($data); // Освобождение памяти
echo "После unset: " . memory_get_usage() . "\n";Начало: 2097152 Шаг 0: 4194304 Шаг 1000: 12320768 ... После unset: 7340032
$mem1 = memory_get_usage();
$array = range(1, 10000);
$mem2 = memory_get_usage();
$splFixedArray = SplFixedArray::fromArray($array);
$mem3 = memory_get_usage();
echo "Обычный массив: " . ($mem2 - $mem1) . "\n";
echo "SplFixedArray: " . ($mem3 - $mem2) . "\n";Обычный массив: 528384 SplFixedArray: 262144
class MemoryTracker {
private $startMemory;
public function __construct() {
$this->startMemory = memory_get_usage();
}
public function getUsage() {
return memory_get_usage() - $this->startMemory;
}
}
$tracker = new MemoryTracker();
$bigArray = array_fill(0, 5000, 'test');
echo "Потрачено внутри: " . $tracker->getUsage() . " байт\n";Потрачено внутри: 614400 байт
$memBefore = memory_get_usage();
$content = file_get_contents('large_file.txt');
$memAfter = memory_get_usage();
echo "Файл загружен в память: " . ($memAfter - $memBefore) . " байт\n";
// Сравнение с размером файла
$fileSize = filesize('large_file.txt');
echo "Размер файла: $fileSize байт\n";