Найти в Дзене
Алексей Додонов

Новый роутер до 1500 раз быстрее чем Aura Router

Всем привет. Продолжаем бенчмаркать роутеры.
В общем-то как и ранее мы рассматриваем два кейса:
1. http сервер принимает запрос от клиента, запускает php скрипт, который собственно и обрабатывает этот запрос, затем выгружает скрипт и все его данные из памяти. Все последующие запросы обрабатываются в таком же ключе. При таком раскладе критично важно запускать скрипт как можно быстрее, поэтому
Оглавление

Всем привет. Продолжаем бенчмаркать роутеры.

В общем-то как и ранее мы рассматриваем два кейса:

1. http сервер принимает запрос от клиента, запускает php скрипт, который собственно и обрабатывает этот запрос, затем выгружает скрипт и все его данные из памяти. Все последующие запросы обрабатываются в таком же ключе. При таком раскладе критично важно запускать скрипт как можно быстрее, поэтому у нас нет времени, чтобы долго готовить роуты к работе. Просто потому что все это будет благополучно выгружено из памяти как только скрипт отработает;

2. запускается php скрипт, инициализирует все необходимые объекты и структуры (роутер естественно тоже) и затем запускает цикл обработки запросов. Так, например работает react-php. Этот кейс принципиально отличается от предыдущего, потому что тут мы уже можем потратить достаточно длительное время на инициализацию, лишь бы потом работало максимально быстро.

Код бэнчмарка для первого кейса

Вот как мы будем генерить роуты

public static function generateAuraStaticRoutes(int $amount): \Aura\Router\Matcher
{
$router = new \Aura\Router\RouterContainer();
$map = $router->getMap();

for ($i = 0; $i < $amount; $i ++) {
$map->get('static.'.$i, '/static/' . $i, '\Mezon\Benchmark\callbackPsr7Response');
}

return $router->getMatcher();
}
public static function generateAuraNonStaticRoutes(int $amount): \Aura\Router\Matcher
{
$router = new \Aura\Router\RouterContainer();
$map = $router->getMap();

for ($i = 0; $i < $amount; $i ++) {
$map->get('param' . $i, '/param/' . $i . '/{id}', '\Mezon\Benchmark\callbackPsr7Response');
}

return $router->getMatcher();
}

Вот бенчмарк для первого кейса

$_SERVER['REQUEST_METHOD'] = 'GET';

for ($i = 0; $i < \Mezon\Benchmark\Base::$iterationsAmount; $i ++) {
$_SERVER['REQUEST_URI'] = '/static/' . rand(0, 1000 - 1);

$request = \Zend\Diactoros\ServerRequestFactory::fromGlobals($_SERVER);

$router = \Mezon\Benchmark\RouteGenerator::generateAuraStaticRoutes(1000);

$route = $router->match($request);
$route->handler($request);
}

Вот бенчмарк для второго кейса

$_SERVER['REQUEST_METHOD'] = 'GET';
$router = \Mezon\Benchmark\RouteGenerator::generateAuraStaticRoutes(1000);

for ($i = 0; $i < \Mezon\Benchmark\Base::$iterationsAmount; $i ++) {
$_SERVER['REQUEST_URI'] = '/static/' . rand(0, 1000 - 1);
$request = \Zend\Diactoros\ServerRequestFactory::fromGlobals($_SERVER);
$route = $router->match($request);
$route->handler($request);
}

Результат

-2

Как вы можете видеть Mezon Router как минимум в 13 раз быстрее чем Aura Router. С последнего релиза Mezon был оптимизирован в плане обработки статических роутов. И скорость выросла до 80%. И у меня в планах сделать больше в следующих релизах.

Что такое Mezon Router?

mezon/router это:

  1. фреймворк для роутинга со 100% покрытием кода;
  2. 10.0 баллов на scrutinizer-ci.com
  3. роутер является частью проекта Mezon

Репа на github.com: https://github.com/alexdodonov/mezon-router

Будет здорово, если вы поучаствуете в жизни проекта. Это может быть написание документации, рекомендации друзьям в социальных сетях, правка багов, рефакторинг, или даже запрос тикета на новую функциональность. В любом случае большое спасибо.