Что выведет код Middle Производительность: OPcache и FPM обновлено
Генератор против массива по памяти
Вопрос
Что выведет скрипт (PHP 8.3)? По строке на каждый вывод.
<?php
function makeArray(int $n): array {
$a = [];
for ($i = 0; $i < $n; $i++) $a[] = str_repeat('x', 100);
return $a;
}
function makeGen(int $n): Generator {
for ($i = 0; $i < $n; $i++) yield str_repeat('x', 100);
}
$start = memory_get_usage();
$total = 0;
foreach (makeGen(100000) as $s) $total += strlen($s);
$genMem = memory_get_peak_usage() - $start;
echo $total, "\n";
echo $genMem < 1_000_000 ? "gen: < 1 MB" : "gen: >= 1 MB", "\n";
$arr = makeArray(100000);
echo count($arr), "\n";
echo memory_get_usage() - $start > 10_000_000 ? "array: > 10 MB" : "array: <= 10 MB", "\n";
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: 10000000, gen: < 1 MB, 100000, array: > 10 MB. Генератор отдаёт по одной строке, и пиковая память почти не растёт.
Что выведет
10000000
gen: < 1 MB
100000
array: > 10 MB
Разбор
Генератор отдаёт по одной строке, и пиковая память почти не растёт. Массив из 100 000 строк по 100 байт держит всё сразу: сами строки плюс структура массива, это больше 10 МБ.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.