Тестирование php фреймворков. Кеш и жадная загрузка для Laravel.


Прошло уже несколько месяцев с моих предыдущих тестов. Почитать о них можно тут (Часть 4, часть 5)
Раньше планировал публиковать со своего аккаунта, но думаю что в сообществе @vp-webdev мои статьи получат больше отклика :)

На сервере произошли некоторые изменения:
php 7.0.20 -> php 7.1.10
mariadb 5.5.52 -> 10.2.8-MariaDB

В связи с этим в протестировал последнюю версию кода, чтобы посмотреть как повлияет смена версии столь важных компонентов.

Пояснения к таблице:
  • framework - тестируемый фреймворк и тестируемая страница
  • requests per second - количество выполненных запросов
  • relative - отношение самого меньшего кол-ва запросов к тестируемому
  • peak memory - пиковое значение памяти выделенное скрипту при тестировании
  • relative - отношение самого меньшего кол-ва выделенной памяти к тестируемому
frameworkrequests per secondrelativepeak memoryrelative
phalcon-index262.746,568.50.441.0
phalcon-authors25.97649.30.561.3
phalcon-categories13.93348.30.571.3
laravel-index9.46236.56.2114.2
laravel-categories6.47161.87.5117.2
laravel-authors6.25156.37.3416.8
phalcon-posts0.092.32.245.1
laravel-posts0.041.015.1334.7

Laravel немого ускорился примерно 5% местами 10% к количеству запросов в секунду.
Phalcon же стал чуть медленнее. Так же на 5-10 %.
Но соотношение осталось примерно такое же как и в предыдущих тестах

Наиболее интересный момент для нас это генерация страниц с постами. (Напомню что на этой странице выводится 1000 записей с тремя связями в других таблицах. Т.е. для каждой запись вытаскивается из базы: имя автора, название категории, теги). Все это создает приличную нагрузку на базу данных.

В данном случае генерация страниц:

  • Phalcon-posts ~ 2.3s
  • Laravel-posts ~5.1s

Код который тестировался соответствует релизу: v0.0.3 (github)

Посмотрим изменит ли ситуацию в пользу Laravel подключение кеша?

Раньше мы получали все записи так:

$posts = Posts::all();

Добавление кеширования в laravel - очень простое действие. Скопируем контроллер PostsController, отвечающий за генерацию страницы posts. Назовем его PostsCacheController:

$posts = Cache::remember('posts', 10,
        function () {
            $posts = Posts::all();
           
            return $posts;
        });

Для меня результаты тестов были большим сюрпризом. Смотрите сами:

frameworkrequests per secondrelativepeak memoryrelative
laravel-index9.93248.36.2114.2
laravel-authors7.20180.07.3416.8
laravel-categories6.80170.07.5117.2
laravel-posts0.041.015.1334.7
laravel-posts-cache0.041.018.4642.3

Наша новая страница - laravel-posts-cache - генерируется столько же сколько и страница без кеша. Я не сразу понял в чем дело. Но потом дошло что кеш создается только на первую выборку записей. А для получения дополнительной информации из связанных таблиц получение данных идет при построении таблицы.
Тогда то я и вспомнил про "Жадную загрузку".

Жадная загрузка.

При жадной загрузке данные из базы данных загружаются вместе с учетом связей из других таблиц. (С использование join, union и прочих конструкций заложенных во фреймворк). Подключение жадной загрузки в Laravel так же просто и быстро как и кеша.

$posts = Posts::with(['author', 'postType', 'categories'])->all();

И результаты:

frameworkrequests per secondrelativepeak memoryrelative
laravel-index9.93248.36.2114.2
laravel-posts-eager_load-cache9.10227.57.3716.9
laravel-posts-eager_load8.02200.57.3616.9
laravel-authors7.20180.07.3416.8
laravel-categories6.80170.07.5117.2
laravel-posts0.041.015.1334.7
laravel-posts-cache0.041.018.4642.3

Как видите скорость генерации страницы с постами увеличилась в десятки раз. При этом еще и потребление памяти уменьшилось. Если же мы добавим в этом случае кеш - то выиграем еще немного в скорости :).

Как мы видим из графиков время генерации соответствующих страниц:

СтраницаВремя генерацииОписание
laravel-posts-el-cache0.234 секLaravel: кеш+ жадная загрузка
laravel-posts-el0.203 секLaravel: жадная загрузка
phalcon-posts2.196 секPhalcon
laravel-posts5.248 секLaravel
laravel-posts-cache5.318 секLaravel: кеш

Добавление кеша и жадной загрузки соответствует релизу v0.0.5 на github

Графики тестов можно посмотреть тут : http://php-frameworks.semasping.info/bm/result-releases/0.0.5/

Roadmap

  • Подключение кеширования для всех фреймворков (Сделано для Laravel. на очереди Phalcon)
  • Реализация тестового приложения и проведение тестов на Symfony
  • Реализация тестового приложения и проведение тестов на Yii
  • Подключение https://blackfire.io/
  • Разобраться с Docker и завернуть все это в него.

С вами был @semasping: делегат и разработчик различных скриптов для пользователей голоса и сообществ @vox-populi.
Поддерживайте статьи автора на стиме: https://steemit.com/@semasping
Голосуйте за него тут https://golos.io/~witnesses или тут https://goldvoice.club/witnesses/
Его делегатский пост https://golos.io/ru--golos/@semasping/delegatskoe-ot-semasping
Всем спасибо за внимание.

vox-populiоткрытый-кодphpframeworksphpсравнение
25%
25
188
77.802 GOLOS
0
В избранное
Web Development
Тех, кто презирает программистов, программисты презирают сильнее, чем те, кто презирает тех программистов, которые презирают тех, кто их презирает.
188
0

Зарегистрируйтесь, чтобы проголосовать за пост или написать комментарий

Авторы получают вознаграждение, когда пользователи голосуют за их посты. Голосующие читатели также получают вознаграждение за свои голоса.

Зарегистрироваться
Комментарии (1)
Сортировать по:
Сначала старые