minor #10241 [DependencyInjection] made some perf improvements (fabpot)

This PR was merged into the 2.6-dev branch.

Discussion
----------

[DependencyInjection] made some perf improvements

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | yes
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | n/a
| License       | MIT
| Doc PR        | n/a

This PR optimizes the creation of dumped containers drastically (thanks @jpauli for the hint).

The Container class generated by the PHP dumper does not include the `getDefaultParameters()` method anymore. It does not seem like a big deal to me as I fail to see a use case where someone would override this method.

Commits
-------

e1a3ef8 [DependencyInjection] made some perf improvements
This commit is contained in:
Fabien Potencier 2014-09-26 07:01:55 +02:00
commit 181e460984
8 changed files with 57 additions and 104 deletions

View File

@ -800,16 +800,18 @@ EOF;
*/ */
private function addConstructor() private function addConstructor()
{ {
$arguments = $this->container->getParameterBag()->all() ? 'new ParameterBag($this->getDefaultParameters())' : null; $parameters = $this->exportParameters($this->container->getParameterBag()->all());
$code = <<<EOF $code = <<<EOF
private static \$parameters = $parameters;
/** /**
* Constructor. * Constructor.
*/ */
public function __construct() public function __construct()
{ {
parent::__construct($arguments); parent::__construct(new ParameterBag(self::\$parameters));
EOF; EOF;
@ -837,23 +839,17 @@ EOF;
*/ */
private function addFrozenConstructor() private function addFrozenConstructor()
{ {
$parameters = $this->exportParameters($this->container->getParameterBag()->all());
$code = <<<EOF $code = <<<EOF
private \$parameters; private static \$parameters = $parameters;
/** /**
* Constructor. * Constructor.
*/ */
public function __construct() public function __construct()
{ {
EOF;
if ($this->container->getParameterBag()->all()) {
$code .= "\n \$this->parameters = \$this->getDefaultParameters();\n";
}
$code .= <<<EOF
\$this->services = \$this->services =
\$this->scopedServices = \$this->scopedServices =
\$this->scopeStacks = array(); \$this->scopeStacks = array();
@ -961,8 +957,6 @@ EOF;
return ''; return '';
} }
$parameters = $this->exportParameters($this->container->getParameterBag()->all());
$code = ''; $code = '';
if ($this->container->isFrozen()) { if ($this->container->isFrozen()) {
$code .= <<<EOF $code .= <<<EOF
@ -974,11 +968,11 @@ EOF;
{ {
\$name = strtolower(\$name); \$name = strtolower(\$name);
if (!(isset(\$this->parameters[\$name]) || array_key_exists(\$name, \$this->parameters))) { if (!(isset(self::\$parameters[\$name]) || array_key_exists(\$name, self::\$parameters))) {
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', \$name)); throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', \$name));
} }
return \$this->parameters[\$name]; return self::\$parameters[\$name];
} }
/** /**
@ -988,7 +982,7 @@ EOF;
{ {
\$name = strtolower(\$name); \$name = strtolower(\$name);
return isset(\$this->parameters[\$name]) || array_key_exists(\$name, \$this->parameters); return isset(self::\$parameters[\$name]) || array_key_exists(\$name, self::\$parameters);
} }
/** /**
@ -1005,28 +999,15 @@ EOF;
public function getParameterBag() public function getParameterBag()
{ {
if (null === \$this->parameterBag) { if (null === \$this->parameterBag) {
\$this->parameterBag = new FrozenParameterBag(\$this->parameters); \$this->parameterBag = new FrozenParameterBag(self::\$parameters);
} }
return \$this->parameterBag; return \$this->parameterBag;
} }
EOF; EOF;
} }
$code .= <<<EOF
/**
* Gets the default parameters.
*
* @return array An array of the default parameters
*/
protected function getDefaultParameters()
{
return $parameters;
}
EOF;
return $code; return $code;
} }

View File

@ -17,11 +17,15 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
*/ */
class Container extends AbstractContainer class Container extends AbstractContainer
{ {
private static $parameters = array(
);
/** /**
* Constructor. * Constructor.
*/ */
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct(new ParameterBag(self::$parameters));
} }
} }

View File

@ -16,11 +16,15 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
*/ */
class ProjectServiceContainer extends Container class ProjectServiceContainer extends Container
{ {
private static $parameters = array(
);
/** /**
* Constructor. * Constructor.
*/ */
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct(new ParameterBag(self::$parameters));
} }
} }

View File

@ -16,15 +16,16 @@ use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
*/ */
class ProjectServiceContainer extends Container class ProjectServiceContainer extends Container
{ {
private $parameters; private static $parameters = array(
'empty_value' => '',
'some_string' => '-',
);
/** /**
* Constructor. * Constructor.
*/ */
public function __construct() public function __construct()
{ {
$this->parameters = $this->getDefaultParameters();
$this->services = $this->services =
$this->scopedServices = $this->scopedServices =
$this->scopeStacks = array(); $this->scopeStacks = array();
@ -68,11 +69,11 @@ class ProjectServiceContainer extends Container
{ {
$name = strtolower($name); $name = strtolower($name);
if (!(isset($this->parameters[$name]) || array_key_exists($name, $this->parameters))) { if (!(isset(self::$parameters[$name]) || array_key_exists($name, self::$parameters))) {
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name)); throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
} }
return $this->parameters[$name]; return self::$parameters[$name];
} }
/** /**
@ -82,7 +83,7 @@ class ProjectServiceContainer extends Container
{ {
$name = strtolower($name); $name = strtolower($name);
return isset($this->parameters[$name]) || array_key_exists($name, $this->parameters); return isset(self::$parameters[$name]) || array_key_exists($name, self::$parameters);
} }
/** /**
@ -99,21 +100,9 @@ class ProjectServiceContainer extends Container
public function getParameterBag() public function getParameterBag()
{ {
if (null === $this->parameterBag) { if (null === $this->parameterBag) {
$this->parameterBag = new FrozenParameterBag($this->parameters); $this->parameterBag = new FrozenParameterBag(self::$parameters);
} }
return $this->parameterBag; return $this->parameterBag;
} }
/**
* Gets the default parameters.
*
* @return array An array of the default parameters
*/
protected function getDefaultParameters()
{
return array(
'empty_value' => '',
'some_string' => '-',
);
}
} }

View File

@ -16,7 +16,9 @@ use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
*/ */
class ProjectServiceContainer extends Container class ProjectServiceContainer extends Container
{ {
private $parameters; private static $parameters = array(
);
/** /**
* Constructor. * Constructor.

View File

@ -16,22 +16,7 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
*/ */
class ProjectServiceContainer extends Container class ProjectServiceContainer extends Container
{ {
/** private static $parameters = array(
* Constructor.
*/
public function __construct()
{
parent::__construct(new ParameterBag($this->getDefaultParameters()));
}
/**
* Gets the default parameters.
*
* @return array An array of the default parameters
*/
protected function getDefaultParameters()
{
return array(
'foo' => '%baz%', 'foo' => '%baz%',
'baz' => 'bar', 'baz' => 'bar',
'bar' => 'foo is %%foo bar', 'bar' => 'foo is %%foo bar',
@ -47,5 +32,12 @@ class ProjectServiceContainer extends Container
7 => 'null', 7 => 'null',
), ),
); );
/**
* Constructor.
*/
public function __construct()
{
parent::__construct(new ParameterBag(self::$parameters));
} }
} }

View File

@ -16,12 +16,18 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
*/ */
class ProjectServiceContainer extends Container class ProjectServiceContainer extends Container
{ {
private static $parameters = array(
'baz_class' => 'BazClass',
'foo_class' => 'Bar\\FooClass',
'foo' => 'bar',
);
/** /**
* Constructor. * Constructor.
*/ */
public function __construct() public function __construct()
{ {
parent::__construct(new ParameterBag($this->getDefaultParameters())); parent::__construct(new ParameterBag(self::$parameters));
$this->methodMap = array( $this->methodMap = array(
'bar' => 'getBarService', 'bar' => 'getBarService',
'baz' => 'getBazService', 'baz' => 'getBazService',
@ -370,18 +376,4 @@ class ProjectServiceContainer extends Container
return $instance; return $instance;
} }
/**
* Gets the default parameters.
*
* @return array An array of the default parameters
*/
protected function getDefaultParameters()
{
return array(
'baz_class' => 'BazClass',
'foo_class' => 'Bar\\FooClass',
'foo' => 'bar',
);
}
} }

View File

@ -16,15 +16,17 @@ use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
*/ */
class ProjectServiceContainer extends Container class ProjectServiceContainer extends Container
{ {
private $parameters; private static $parameters = array(
'baz_class' => 'BazClass',
'foo_class' => 'Bar\\FooClass',
'foo' => 'bar',
);
/** /**
* Constructor. * Constructor.
*/ */
public function __construct() public function __construct()
{ {
$this->parameters = $this->getDefaultParameters();
$this->services = $this->services =
$this->scopedServices = $this->scopedServices =
$this->scopeStacks = array(); $this->scopeStacks = array();
@ -320,11 +322,11 @@ class ProjectServiceContainer extends Container
{ {
$name = strtolower($name); $name = strtolower($name);
if (!(isset($this->parameters[$name]) || array_key_exists($name, $this->parameters))) { if (!(isset(self::$parameters[$name]) || array_key_exists($name, self::$parameters))) {
throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name)); throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
} }
return $this->parameters[$name]; return self::$parameters[$name];
} }
/** /**
@ -334,7 +336,7 @@ class ProjectServiceContainer extends Container
{ {
$name = strtolower($name); $name = strtolower($name);
return isset($this->parameters[$name]) || array_key_exists($name, $this->parameters); return isset(self::$parameters[$name]) || array_key_exists($name, self::$parameters);
} }
/** /**
@ -351,22 +353,9 @@ class ProjectServiceContainer extends Container
public function getParameterBag() public function getParameterBag()
{ {
if (null === $this->parameterBag) { if (null === $this->parameterBag) {
$this->parameterBag = new FrozenParameterBag($this->parameters); $this->parameterBag = new FrozenParameterBag(self::$parameters);
} }
return $this->parameterBag; return $this->parameterBag;
} }
/**
* Gets the default parameters.
*
* @return array An array of the default parameters
*/
protected function getDefaultParameters()
{
return array(
'baz_class' => 'BazClass',
'foo_class' => 'Bar\\FooClass',
'foo' => 'bar',
);
}
} }