- Pux uses simpler data structure (indexed array) to store the patterns and flags. (In PHP internals, zend_hash_index_find is faster than zend_hash_find).
- When matching routes, symfony uses a lot of function calls for each route:
https://github.com/symfony/Routing/blob/master/Matcher/UrlMa...
- Pux fetches the pattern from an indexed-array:
https://github.com/c9s/Pux/blob/master/src/Pux/Mux.php#L189
- Pux separates static routes and dynamic routes automatically, Pux uses hash table to look up static routes without looping the whole route array.
- Pux\Mux is written in C extension, method calls are faster!
- With C extension, there is no class loading overhead.
- Pux compiles routes to plain PHP array, the compiled routes can be loaded very fast. you don't need to call functions to register your routes before using it.
> When matching routes, symfony uses a lot of function calls for each route
This is the slow UrlMatcher. The one used by default in the standard symfony edition generates code like this: https://github.com/symfony/Routing/blob/0ee25e6580bd4169c128... , and this code is used for matching instead.
And "compiled to php" is kinda meaningless, it depends what it's compiled to. There is no "native routing" language.
For my two cents, if you're having to translate your solution into simpler code your solution is wrong.
By not utilizing the symfony/routing cache at all.
Sorry to say, this is a meaningless test.
symfony/routing compiles routes only once to PHP code ([1]), and then that generated code is used for matching all subsequent requests. (There are multiple route matchers, but the default one works like this.)
It's amazing that Pux manages to be close to 50x times faster.
How is this achieved ?
[1] https://github.com/symfony/Routing/blob/0ee25e6580bd4169c128...