Рассмотрим структуры данных из стандартной библиотеки 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);
}
VERSION | TIME | MEMORY | MEMORY PEAK |
---|---|---|---|
5.6 | 1.0570449829102 | 442236928 | 442236928 |
7 | 0.35105609893799 | 136318976 | 136318976 |
Чтение: 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]);
}
VERSION | TIME | MEMORY | MEMORY PEAK |
---|---|---|---|
5.6 | 1.8466589450836 | 34865152 | 442236928 |
7 | 0.92776489257812 | 136318976 | 136318976 |
SPL Link to heading
Запись: Link to heading
<?
$repeatSize = 3000000;
$stack = new SplQueue();
for ($i=1; $i<$repeatSize; $i++){
$stack->enqueue($i);
}
VERSION | TIME | MEMORY | MEMORY PEAK |
---|---|---|---|
5.6 | 0.79875707626343 | 288358400 | 288358400 |
7 | 0.39700293540955 | 121634816 | 121634816 |
Чтение 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) {}
VERSION | TIME | MEMORY | MEMORY PEAK |
---|---|---|---|
5.6 | 0.58935618400574 | 1048576 | 288358400 |
7 | 0.19628190994263 | 121634816 | 121634816 |