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

Новый PHP роутер который от 7 до 15 раз быстрее чем роутер Symfony

Всем привет. Продолжаем тему, начатую в предыдущей статье.
И в этот раз сравним mezon router с роутером популярного фреймворка Symfony.
Бенчмаркинг mezon/router
В этот раз я решил немного изменить бенчмарк. В этот раз будем замерять не только резолвинг роутов но и их создание.
Оглавление

Всем привет. Продолжаем тему, начатую в предыдущей статье.

И в этот раз сравним mezon router с роутером популярного фреймворка Symfony.

Бенчмаркинг mezon/router

В этот раз я решил немного изменить бенчмарк. В этот раз будем замерять не только резолвинг роутов но и их создание.

Например, мы будем оценивать время исполнения не только этого кода:

for ($i = 0; $i < $iterationCount1; $i ++) {
$routerTest1->callRoute('/static');
}

Но и этого тоже:

for ($i = 0; $i < $iterationCount1; $i ++) {
$routerTest1 = new \Mezon\Router\Router();
$routerTest1->addRoute('/static', function () {
return 'static';
}, 'GET');
$routerTest1->callRoute('/static');
}

Бенчмарк klein/klein

Тут будут аналогичные изменения в замерах:

for ($i = 0; $i < $iterationCount1; $i ++) {
$routerTest1 = new \Klein\Klein();
$routerTest1->respond('GET', '/static', function () {
return 'static';
});
$routerTest1->dispatch(null,null,true,\Klein\Klein::DISPATCH_CAPTURE_AND_RETURN);
}

And:

for ($i = 0; $i < $iterationCount2; $i ++) {
$routerTest2 = new \Klein\Klein();
$routerTest2->respond('GET', '/[i:id]', function () {
return 'param';
});
$routerTest2->dispatch(null,null,true,\Klein\Klein::DISPATCH_CAPTURE_AND_RETURN);
}

Бенчмарк для роутера Symfony

И теперь переходим к Symfony:

$iterationCount1 = 10000;
$startTime1 = microtime(true);
for ($i = 0; $i < $iterationCount1; $i ++) {
$static = new Route('/static', [
'controller' => function () {
return 'static';
}
]);
$staticRoutes = new RouteCollection();
$staticRoutes->add('static', $static);

$staticContext = new RequestContext();
$staticContext->fromRequest(Request::createFromGlobals());

$staticMatcher = new UrlMatcher($staticRoutes, $staticContext);
$parameters = $staticMatcher->match('/static');
$parameters['controller']();
}
$endTime1 = microtime(true);

Это были статичные роуты, а теперь нестатичные:

$iterationCount2 = 10000;
$startTime2 = microtime(true);
for ($i = 0; $i < $iterationCount2; $i ++) {
$param = new Route('/{id}', [
'controller' => function () {
return 'param';
},
[
'id' => '[0-9]+'
]
]);

$paramRoutes = new RouteCollection();
$paramRoutes->add('param', $param);

$paramContext = new RequestContext();
$paramContext->fromRequest(Request::createFromGlobals());

$paramMatcher = new UrlMatcher($paramRoutes, $paramContext);
$paramMatcher->match('/1')['controller']();
}
$endTime2 = microtime(true);

Ну и плавно переходим к результатам:

-2

Как можно заметить Mezon Router от 7 до 15 раз быстрее роутера Symfony.

Что такое Mezon/Router?
mezon/router это:

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