Тестирование 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
- отношение самого меньшего кол-ва выделенной памяти к тестируемому
framework | requests per second | relative | peak memory | relative |
---|---|---|---|---|
phalcon-index | 262.74 | 6,568.5 | 0.44 | 1.0 |
phalcon-authors | 25.97 | 649.3 | 0.56 | 1.3 |
phalcon-categories | 13.93 | 348.3 | 0.57 | 1.3 |
laravel-index | 9.46 | 236.5 | 6.21 | 14.2 |
laravel-categories | 6.47 | 161.8 | 7.51 | 17.2 |
laravel-authors | 6.25 | 156.3 | 7.34 | 16.8 |
phalcon-posts | 0.09 | 2.3 | 2.24 | 5.1 |
laravel-posts | 0.04 | 1.0 | 15.13 | 34.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;
});
Для меня результаты тестов были большим сюрпризом. Смотрите сами:
framework | requests per second | relative | peak memory | relative |
---|---|---|---|---|
laravel-index | 9.93 | 248.3 | 6.21 | 14.2 |
laravel-authors | 7.20 | 180.0 | 7.34 | 16.8 |
laravel-categories | 6.80 | 170.0 | 7.51 | 17.2 |
laravel-posts | 0.04 | 1.0 | 15.13 | 34.7 |
laravel-posts-cache | 0.04 | 1.0 | 18.46 | 42.3 |
Наша новая страница - laravel-posts-cache
- генерируется столько же сколько и страница без кеша. Я не сразу понял в чем дело. Но потом дошло что кеш создается только на первую выборку записей. А для получения дополнительной информации из связанных таблиц получение данных идет при построении таблицы.
Тогда то я и вспомнил про "Жадную загрузку".
Жадная загрузка.
При жадной загрузке данные из базы данных загружаются вместе с учетом связей из других таблиц. (С использование join, union и прочих конструкций заложенных во фреймворк). Подключение жадной загрузки в Laravel так же просто и быстро как и кеша.
$posts = Posts::with(['author', 'postType', 'categories'])->all();
И результаты:
framework | requests per second | relative | peak memory | relative |
---|---|---|---|---|
laravel-index | 9.93 | 248.3 | 6.21 | 14.2 |
laravel-posts-eager_load-cache | 9.10 | 227.5 | 7.37 | 16.9 |
laravel-posts-eager_load | 8.02 | 200.5 | 7.36 | 16.9 |
laravel-authors | 7.20 | 180.0 | 7.34 | 16.8 |
laravel-categories | 6.80 | 170.0 | 7.51 | 17.2 |
laravel-posts | 0.04 | 1.0 | 15.13 | 34.7 |
laravel-posts-cache | 0.04 | 1.0 | 18.46 | 42.3 |
Как видите скорость генерации страницы с постами увеличилась в десятки раз. При этом еще и потребление памяти уменьшилось. Если же мы добавим в этом случае кеш - то выиграем еще немного в скорости :).
Как мы видим из графиков время генерации соответствующих страниц:
Страница | Время генерации | Описание |
---|---|---|
laravel-posts-el-cache | 0.234 сек | Laravel: кеш+ жадная загрузка |
laravel-posts-el | 0.203 сек | Laravel: жадная загрузка |
phalcon-posts | 2.196 сек | Phalcon |
laravel-posts | 5.248 сек | Laravel |
laravel-posts-cache | 5.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
Всем спасибо за внимание.