Что выведет код 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 ошибок.