forked from https://github.com/symfony/symfony
4ef0b3e180
This PR was merged into the 4.1-dev branch.
Discussion
----------
[Routing] Match 77.7x faster by compiling routes in one regexp
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | -
| License | MIT
| Doc PR | -
Builds on top of #25961 and http://nikic.github.io/2014/02/18/Fast-request-routing-using-regular-expressions.html to make routing 77.7x faster (measured when matching the last dynamic route of 400 static + 400 dynamic routes.)
More benchs welcomed.
- [x] check static routes first in a switch
- [x] group same-modifiers regexps
- [x] put condition-less routes in a static map, in a switch's "default"
- [x] match host+pathinfo at the same time
- [x] group same-host regexps in sub-patterns
- [x] consider the host to move more static routes in the static switch
- [x] move static single-route "case" to "default" by adding requirements to $routes
- [x] group same-static-prefix in sub-patterns
- [x] group consecutive same-regex in a single "case"
- [x] move dynamic single-route "case" to "default" by adding requirements to $routes
- [x] extract host variables from the main match and remove the current 2nd match
- [x] extend same-prefix grouping to placeholders
- [x] group same-suffix hosts together
Here is my benchmarking code:
```php
<?php
namespace Symfony\Component\Routing;
require 'vendor/autoload.php';
$routes = new RouteCollection();
for ($i = 0; $i < 400; ++$i) {
$routes->add('r'.$i, new Route('/abc'.$i));
$routes->add('f'.$i, new Route('/abc{foo}/'.$i));
}
$dumper = new Matcher\Dumper\PhpMatcherDumper($routes);
eval('?'.'>'.$dumper->dump());
$router = new \ProjectUrlMatcher(new RequestContext());
$i = 10000;
$s = microtime(1);
while (--$i) {
$router->match('/abcdef/399');
}
echo 'Symfony: ', 1000 * (microtime(1) - $s), "\n";
namespace FastRoute;
$dispatcher = simpleDispatcher(function(RouteCollector $r) {
for ($i = 0; $i < 400; ++$i) {
$r->addRoute('GET', '/abc'.$i, 'r'.$i);
$r->addRoute('GET', '/abc{foo}/'.$i, 'f'.$i);
}
});
$i = 10000;
$s = microtime(1);
while (--$i) {
$dispatcher->dispatch('GET', '/abcdef/399');
}
echo 'FastRoute: ', 1000 * (microtime(1) - $s), "\n";
```
Commits
-------
|
||
---|---|---|
.composer | ||
.github | ||
src/Symfony | ||
.editorconfig | ||
.gitignore | ||
.php_cs.dist | ||
.travis.yml | ||
appveyor.yml | ||
CHANGELOG-4.0.md | ||
composer.json | ||
CONTRIBUTING.md | ||
CONTRIBUTORS.md | ||
LICENSE | ||
link | ||
phpunit | ||
phpunit.xml.dist | ||
README.md | ||
UPGRADE-4.0.md | ||
UPGRADE-4.1.md | ||
UPGRADE-5.0.md |
Symfony is a PHP framework for web applications and a set of reusable PHP components. Symfony is used by thousands of web applications (including BlaBlaCar.com and Spotify.com) and most of the popular PHP projects (including Drupal and Magento).
Installation
- Install Symfony with Composer (see requirements details).
- Symfony follows the semantic versioning strictly, publishes "Long Term Support" (LTS) versions and has a release process that is predictable and business-friendly.
Documentation
- Read the Getting Started guide if you are new to Symfony.
- Try the Symfony Demo application to learn Symfony in practice.
- Master Symfony with the Guides and Tutorials, the Components docs and the Best Practices reference.
Community
- Join the Symfony Community and meet other members at the Symfony events.
- Get Symfony support on Stack Overflow, Slack, IRC, etc.
- Follow us on GitHub, Twitter and Facebook.
Contributing
Symfony is an Open Source, community-driven project with thousands of contributors. Join them contributing code or contributing documentation.
Security Issues
If you discover a security vulnerability within Symfony, please follow our disclosure procedure.
About Us
Symfony development is sponsored by SensioLabs, led by the Symfony Core Team and supported by Symfony contributors.