Рассмотрим структуры данных из стандартной библиотеки php (SPL) и процедурный подход с массивами. И замеряем скорость выполнения на разных версиях PHP, а именно на 5.6 и 7. Сегодняшняя тема: «структура Очередь».

Очередь — абстрактный тип данных с дисциплиной доступа к элементам «первый пришёл — первый вышел» (FIFO, First In — First Out). Добавление элемента (принято обозначать словом enqueue — поставить в очередь) возможно лишь в конец очереди, выборка — только из начала очереди (что принято называть словом dequeue — убрать из очереди), при этом выбранный элемент из очереди удаляется.

Результат если лень читать:

Процедурный подход Link to heading

Запись: Link to heading

<?
$repeatSize = 3000000;
$stack = [];
for ($i=1; $i<$repeatSize; $i++){
    array_push($stack, $i);
}
VERSIONTIMEMEMORYMEMORY PEAK
5.61.0570449829102442236928442236928
70.35105609893799136318976136318976

Чтение: Link to heading

Для чтения использую each и unset вместо array_shift. array_shift после извлечения постоянно пересчитывает индексы элементов, и при количестве 3000000 элементов скрипт очень долго выполняется.

<?
$repeatSize = 3000000;
$stack = [];
for ($i=1; $i<$repeatSize; $i++){
    array_push($stack, $i);
}
//start timer
reset($stack);
while(list($key, $value) = each($stack)){
    unset($stack[$key]);
}
VERSIONTIMEMEMORYMEMORY PEAK
5.61.846658945083634865152442236928
70.92776489257812136318976136318976

SPL Link to heading

Запись: Link to heading

<?
$repeatSize = 3000000;
$stack = new SplQueue();
for ($i=1; $i<$repeatSize; $i++){
    $stack->enqueue($i);
}
VERSIONTIMEMEMORYMEMORY PEAK
5.60.79875707626343288358400288358400
70.39700293540955121634816121634816

Чтение Link to heading

<?
$repeatSize = 3000000;
$stack = new SplQueue();
for ($i=1; $i<$repeatSize; $i++){
    $stack->enqueue($i);
}
//start timer
try {
    while ($stack->dequeue());
} catch (RuntimeException $e) {}
VERSIONTIMEMEMORYMEMORY PEAK
5.60.589356184005741048576288358400
70.19628190994263121634816121634816