You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
bug #25474 [DI] Optimize Container::get() for perf (nicolas-grekas)
This PR was merged into the 3.4 branch.
Discussion
----------
[DI] Optimize Container::get() for perf
| Q | A
| ------------- | ---
| Branch? | 3.4
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #25159
| License | MIT
| Doc PR | -
As outlined in #25159, our beloved container suffers from a perf hit just because it has a second argument, and this second argument's default value makes it slower.
Let's fix this by inlining the value. This will put Symfony at a better rank on eg:
https://github.com/kocsismate/php-di-container-benchmarks
I benched also with the following script. The result is surprising (but matches the finding in #25159):
without the patch, it takes 2s, and with the patch, it's down to 1s (opcache enabled).
```php
require './vendor/autoload.php';
use Symfony\Component\DependencyInjection\Container;
$c = new Container();
$c->set('foo', new \stdClass());
$i = 10000000;
$s = microtime(1);
while (--$i) {
$c->get('foo');
}
echo microtime(true) - $s, "\n";
```
Commits
-------
4fe2551 [DI] Optimize Container::get() for perf
@@ -306,7 +306,7 @@ public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE
306
306
// and only when the dumper has not generated the method map (otherwise the method map is considered to be fully populated by the dumper)
307
307
@trigger_error('Generating a dumped container without populating the method map is deprecated since 3.2 and will be unsupported in 4.0. Update your dumper to generate the method map.', E_USER_DEPRECATED);
0 commit comments