Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 020664e

Browse files
committed
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
2 parents 24e274d + 4fe2551 commit 020664e

File tree

3 files changed

+10
-10
lines changed

3 files changed

+10
-10
lines changed

src/Symfony/Component/DependencyInjection/Container.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ public function has($id)
264264
*
265265
* @see Reference
266266
*/
267-
public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE)
267+
public function get($id, $invalidBehavior = /* self::EXCEPTION_ON_INVALID_REFERENCE */ 1)
268268
{
269269
// Attempt to retrieve the service by checking first aliases then
270270
// available services. Service IDs are case insensitive, however since
@@ -294,9 +294,9 @@ public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE
294294

295295
try {
296296
if (isset($this->fileMap[$id])) {
297-
return self::IGNORE_ON_UNINITIALIZED_REFERENCE === $invalidBehavior ? null : $this->load($this->fileMap[$id]);
297+
return /* self::IGNORE_ON_UNINITIALIZED_REFERENCE */ 4 === $invalidBehavior ? null : $this->load($this->fileMap[$id]);
298298
} elseif (isset($this->methodMap[$id])) {
299-
return self::IGNORE_ON_UNINITIALIZED_REFERENCE === $invalidBehavior ? null : $this->{$this->methodMap[$id]}();
299+
return /* self::IGNORE_ON_UNINITIALIZED_REFERENCE */ 4 === $invalidBehavior ? null : $this->{$this->methodMap[$id]}();
300300
} elseif (--$i && $id !== $normalizedId = $this->normalizeId($id)) {
301301
unset($this->loading[$id]);
302302
$id = $normalizedId;
@@ -306,7 +306,7 @@ public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE
306306
// and only when the dumper has not generated the method map (otherwise the method map is considered to be fully populated by the dumper)
307307
@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);
308308

309-
return self::IGNORE_ON_UNINITIALIZED_REFERENCE === $invalidBehavior ? null : $this->{$method}();
309+
return /* self::IGNORE_ON_UNINITIALIZED_REFERENCE */ 4 === $invalidBehavior ? null : $this->{$method}();
310310
}
311311

312312
break;
@@ -319,7 +319,7 @@ public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE
319319
}
320320
}
321321

322-
if (self::EXCEPTION_ON_INVALID_REFERENCE === $invalidBehavior) {
322+
if (/* self::EXCEPTION_ON_INVALID_REFERENCE */ 1 === $invalidBehavior) {
323323
if (!$id) {
324324
throw new ServiceNotFoundException($id);
325325
}

src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1854,7 +1854,7 @@ private function getServiceCall($id, Reference $reference = null)
18541854
} elseif (null !== $reference && ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $reference->getInvalidBehavior()) {
18551855
return 'null';
18561856
} elseif (null !== $reference && ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $reference->getInvalidBehavior()) {
1857-
$code = sprintf('$this->get(\'%s\', ContainerInterface::NULL_ON_INVALID_REFERENCE)', $id);
1857+
$code = sprintf('$this->get(\'%s\', /* ContainerInterface::NULL_ON_INVALID_REFERENCE */ %d)', $id, ContainerInterface::NULL_ON_INVALID_REFERENCE);
18581858
} else {
18591859
$code = sprintf('$this->get(\'%s\')', $id);
18601860
}

src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ protected function getLazyContextIgnoreInvalidRefService()
281281
return $this->services['lazy_context_ignore_invalid_ref'] = new \LazyContext(new RewindableGenerator(function () {
282282
yield 0 => ${($_ = isset($this->services['foo.baz']) ? $this->services['foo.baz'] : $this->getFoo_BazService()) && false ?: '_'};
283283
if ($this->has('invalid')) {
284-
yield 1 => ${($_ = isset($this->services['invalid']) ? $this->services['invalid'] : $this->get('invalid', ContainerInterface::NULL_ON_INVALID_REFERENCE)) && false ?: '_'};
284+
yield 1 => ${($_ = isset($this->services['invalid']) ? $this->services['invalid'] : $this->get('invalid', /* ContainerInterface::NULL_ON_INVALID_REFERENCE */ 2)) && false ?: '_'};
285285
}
286286
}, function () {
287287
return 1 + (int) ($this->has('invalid'));
@@ -302,12 +302,12 @@ protected function getMethodCall1Service()
302302
$this->services['method_call1'] = $instance = new \Bar\FooClass();
303303

304304
$instance->setBar(${($_ = isset($this->services['foo']) ? $this->services['foo'] : $this->getFooService()) && false ?: '_'});
305-
$instance->setBar(${($_ = isset($this->services['foo2']) ? $this->services['foo2'] : $this->get('foo2', ContainerInterface::NULL_ON_INVALID_REFERENCE)) && false ?: '_'});
305+
$instance->setBar(${($_ = isset($this->services['foo2']) ? $this->services['foo2'] : $this->get('foo2', /* ContainerInterface::NULL_ON_INVALID_REFERENCE */ 2)) && false ?: '_'});
306306
if ($this->has('foo3')) {
307-
$instance->setBar(${($_ = isset($this->services['foo3']) ? $this->services['foo3'] : $this->get('foo3', ContainerInterface::NULL_ON_INVALID_REFERENCE)) && false ?: '_'});
307+
$instance->setBar(${($_ = isset($this->services['foo3']) ? $this->services['foo3'] : $this->get('foo3', /* ContainerInterface::NULL_ON_INVALID_REFERENCE */ 2)) && false ?: '_'});
308308
}
309309
if ($this->has('foobaz')) {
310-
$instance->setBar(${($_ = isset($this->services['foobaz']) ? $this->services['foobaz'] : $this->get('foobaz', ContainerInterface::NULL_ON_INVALID_REFERENCE)) && false ?: '_'});
310+
$instance->setBar(${($_ = isset($this->services['foobaz']) ? $this->services['foobaz'] : $this->get('foobaz', /* ContainerInterface::NULL_ON_INVALID_REFERENCE */ 2)) && false ?: '_'});
311311
}
312312
$instance->setBar((${($_ = isset($this->services['foo']) ? $this->services['foo'] : $this->getFooService()) && false ?: '_'}->foo() . (($this->hasParameter("foo")) ? ($this->getParameter("foo")) : ("default"))));
313313

0 commit comments

Comments
 (0)