Skip to content

Commit

Permalink
Merge pull request #94 from boesing/feature/benchmark-has-performance
Browse files Browse the repository at this point in the history
qa: add benchmark for `ServiceManager::has`
  • Loading branch information
Ocramius authored Jul 24, 2021
2 parents c44bac1 + d6e7fe4 commit 578554f
Show file tree
Hide file tree
Showing 17 changed files with 334 additions and 118 deletions.
6 changes: 4 additions & 2 deletions benchmarks/BenchAsset/AbstractFactoryFoo.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,18 @@

class AbstractFactoryFoo implements AbstractFactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
/** {@inheritDoc} */
public function __invoke(ContainerInterface $container, $requestedName, ?array $options = null)
{
if ($requestedName === 'foo') {
return new Foo($options);
}
return false;
}

/** {@inheritDoc} */
public function canCreate(ContainerInterface $container, $requestedName)
{
return ($requestedName === 'foo');
return $requestedName === 'foo';
}
}
2 changes: 2 additions & 0 deletions benchmarks/BenchAsset/Bar.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@

class Bar
{
/** @var mixed */
protected $options;

/** @param mixed $options */
public function __construct($options = null)
{
$this->options = $options;
Expand Down
3 changes: 2 additions & 1 deletion benchmarks/BenchAsset/FactoryFoo.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@

class FactoryFoo implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
/** {@inheritDoc} */
public function __invoke(ContainerInterface $container, $requestedName, ?array $options = null)
{
return new Foo($options);
}
Expand Down
2 changes: 2 additions & 0 deletions benchmarks/BenchAsset/Foo.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@

class Foo
{
/** @var mixed */
protected $options;

/** @param mixed $options */
public function __construct($options = null)
{
$this->options = $options;
Expand Down
6 changes: 2 additions & 4 deletions benchmarks/BenchAsset/ServiceDependingOnConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,8 @@

class ServiceDependingOnConfig
{
/**
* @var array
*/
private $config;
/** @var array */
public $config;

public function __construct(array $config)
{
Expand Down
9 changes: 2 additions & 7 deletions benchmarks/BenchAsset/ServiceWithDependency.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,9 @@

class ServiceWithDependency
{
/**
* @var Dependency
*/
private $dependency;
/** @var Dependency */
protected $dependency;

/**
* @param Dependency $dependency
*/
public function __construct(Dependency $dependency)
{
$this->dependency = $dependency;
Expand Down
33 changes: 16 additions & 17 deletions benchmarks/FetchCachedServicesBench.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use PhpBench\Benchmark\Metadata\Annotations\Iterations;
use PhpBench\Benchmark\Metadata\Annotations\Revs;
use PhpBench\Benchmark\Metadata\Annotations\Warmup;
use stdClass;

/**
* @Revs(1000)
Expand All @@ -14,31 +15,29 @@
*/
class FetchCachedServicesBench
{
/**
* @var ServiceManager
*/
/** @var ServiceManager */
private $sm;

public function __construct()
{
$this->sm = new ServiceManager([
'factories' => [
'factories' => [
'factory1' => BenchAsset\FactoryFoo::class,
],
'invokables' => [
'invokables' => [
'invokable1' => BenchAsset\Foo::class,
],
'services' => [
'service1' => new \stdClass(),
'services' => [
'service1' => new stdClass(),
],
'aliases' => [
'aliases' => [
'alias1' => 'service1',
'recursiveAlias1' => 'alias1',
'recursiveAlias2' => 'recursiveAlias1',
],
'abstract_factories' => [
BenchAsset\AbstractFactoryFoo::class
]
BenchAsset\AbstractFactoryFoo::class,
],
]);

// forcing initialization of all the services
Expand All @@ -50,55 +49,55 @@ public function __construct()
$this->sm->get('recursiveAlias2');
}

public function benchFetchFactory1()
public function benchFetchFactory1(): void
{
// @todo @link https://github.com/phpbench/phpbench/issues/304
$sm = clone $this->sm;

$sm->get('factory1');
}

public function benchFetchInvokable1()
public function benchFetchInvokable1(): void
{
// @todo @link https://github.com/phpbench/phpbench/issues/304
$sm = clone $this->sm;

$sm->get('invokable1');
}

public function benchFetchService1()
public function benchFetchService1(): void
{
// @todo @link https://github.com/phpbench/phpbench/issues/304
$sm = clone $this->sm;

$sm->get('service1');
}

public function benchFetchAlias1()
public function benchFetchAlias1(): void
{
// @todo @link https://github.com/phpbench/phpbench/issues/304
$sm = clone $this->sm;

$sm->get('alias1');
}

public function benchFetchRecursiveAlias1()
public function benchFetchRecursiveAlias1(): void
{
// @todo @link https://github.com/phpbench/phpbench/issues/304
$sm = clone $this->sm;

$sm->get('recursiveAlias1');
}

public function benchFetchRecursiveAlias2()
public function benchFetchRecursiveAlias2(): void
{
// @todo @link https://github.com/phpbench/phpbench/issues/304
$sm = clone $this->sm;

$sm->get('recursiveAlias2');
}

public function benchFetchAbstractFactoryService()
public function benchFetchAbstractFactoryService(): void
{
// @todo @link https://github.com/phpbench/phpbench/issues/304
$sm = clone $this->sm;
Expand Down
11 changes: 5 additions & 6 deletions benchmarks/FetchNewServiceManagerBench.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use PhpBench\Benchmark\Metadata\Annotations\Iterations;
use PhpBench\Benchmark\Metadata\Annotations\Revs;
use PhpBench\Benchmark\Metadata\Annotations\Warmup;
use stdClass;

/**
* @Revs(100)
Expand All @@ -14,11 +15,9 @@
*/
class FetchNewServiceManagerBench
{
const NUM_SERVICES = 1000;
private const NUM_SERVICES = 1000;

/**
* @var array
*/
/** @var array */
private $config = [];

public function __construct()
Expand All @@ -33,7 +32,7 @@ public function __construct()
],
];

$service = new \stdClass();
$service = new stdClass();

for ($i = 0; $i <= self::NUM_SERVICES; $i++) {
$config['factories']["factory_$i"] = BenchAsset\FactoryFoo::class;
Expand All @@ -44,7 +43,7 @@ public function __construct()
$this->config = $config;
}

public function benchFetchServiceManagerCreation()
public function benchFetchServiceManagerCreation(): void
{
new ServiceManager($this->config);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,17 @@
*/
class FetchNewServiceUsingConfigAbstractFactoryAsFactoryBench
{
/**
* @var ServiceManager
*/
/** @var ServiceManager */
private $sm;

public function __construct()
{
$this->sm = new ServiceManager([
'services' => [
'services' => [
'config' => [
ConfigAbstractFactory::class => [
BenchAsset\Dependency::class => [],
BenchAsset\ServiceWithDependency::class => [
BenchAsset\Dependency::class => [],
BenchAsset\ServiceWithDependency::class => [
BenchAsset\Dependency::class,
],
BenchAsset\ServiceDependingOnConfig::class => [
Expand All @@ -37,49 +35,49 @@ public function __construct()
],
],
'factories' => [
BenchAsset\Dependency::class => ConfigAbstractFactory::class,
BenchAsset\ServiceWithDependency::class => ConfigAbstractFactory::class,
BenchAsset\Dependency::class => ConfigAbstractFactory::class,
BenchAsset\ServiceWithDependency::class => ConfigAbstractFactory::class,
BenchAsset\ServiceDependingOnConfig::class => ConfigAbstractFactory::class,
],
]);
}

public function benchFetchServiceWithNoDependencies()
public function benchFetchServiceWithNoDependencies(): void
{
$sm = clone $this->sm;

$sm->get(BenchAsset\Dependency::class);
}

public function benchBuildServiceWithNoDependencies()
public function benchBuildServiceWithNoDependencies(): void
{
$sm = clone $this->sm;

$sm->build(BenchAsset\Dependency::class);
}

public function benchFetchServiceDependingOnConfig()
public function benchFetchServiceDependingOnConfig(): void
{
$sm = clone $this->sm;

$sm->get(BenchAsset\ServiceDependingOnConfig::class);
}

public function benchBuildServiceDependingOnConfig()
public function benchBuildServiceDependingOnConfig(): void
{
$sm = clone $this->sm;

$sm->build(BenchAsset\ServiceDependingOnConfig::class);
}

public function benchFetchServiceWithDependency()
public function benchFetchServiceWithDependency(): void
{
$sm = clone $this->sm;

$sm->get(BenchAsset\ServiceWithDependency::class);
}

public function benchBuildServiceWithDependency()
public function benchBuildServiceWithDependency(): void
{
$sm = clone $this->sm;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,61 +15,59 @@
*/
class FetchNewServiceUsingReflectionAbstractFactoryAsFactoryBench
{
/**
* @var ServiceManager
*/
/** @var ServiceManager */
private $sm;

public function __construct()
{
$this->sm = new ServiceManager([
'services' => [
'services' => [
'config' => [],
],
'factories' => [
BenchAsset\Dependency::class => ReflectionBasedAbstractFactory::class,
BenchAsset\ServiceWithDependency::class => ReflectionBasedAbstractFactory::class,
BenchAsset\Dependency::class => ReflectionBasedAbstractFactory::class,
BenchAsset\ServiceWithDependency::class => ReflectionBasedAbstractFactory::class,
BenchAsset\ServiceDependingOnConfig::class => ReflectionBasedAbstractFactory::class,
],
]);
}

public function benchFetchServiceWithNoDependencies()
public function benchFetchServiceWithNoDependencies(): void
{
$sm = clone $this->sm;

$sm->get(BenchAsset\Dependency::class);
}

public function benchBuildServiceWithNoDependencies()
public function benchBuildServiceWithNoDependencies(): void
{
$sm = clone $this->sm;

$sm->build(BenchAsset\Dependency::class);
}

public function benchFetchServiceDependingOnConfig()
public function benchFetchServiceDependingOnConfig(): void
{
$sm = clone $this->sm;

$sm->get(BenchAsset\ServiceDependingOnConfig::class);
}

public function benchBuildServiceDependingOnConfig()
public function benchBuildServiceDependingOnConfig(): void
{
$sm = clone $this->sm;

$sm->build(BenchAsset\ServiceDependingOnConfig::class);
}

public function benchFetchServiceWithDependency()
public function benchFetchServiceWithDependency(): void
{
$sm = clone $this->sm;

$sm->get(BenchAsset\ServiceWithDependency::class);
}

public function benchBuildServiceWithDependency()
public function benchBuildServiceWithDependency(): void
{
$sm = clone $this->sm;

Expand Down
Loading

0 comments on commit 578554f

Please sign in to comment.