Skip to content

Instantly share code, notes, and snippets.

@igorw
Created October 4, 2012 11:46
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save igorw/3833123 to your computer and use it in GitHub Desktop.
Save igorw/3833123 to your computer and use it in GitHub Desktop.
Benchmark: Pimple vs Symfony/DependencyInjection
{
"require": {
"pimple/pimple": "1.0.*",
"symfony/dependency-injection": "2.1.*"
}
}
$ ./run-tests.sh
Pimple
265K
579K
0.00086s
DependencyInjection
267K
931K
0.006124s
DependencyInjection (dumped)
688K
738K
0.000495s
#!/bin/bash
FLAGS="-d xdebug.max_nesting_level=300"
echo "Pimple"
php $FLAGS test-pimple.php
echo "DependencyInjection"
php $FLAGS test-di.php
echo "DependencyInjection (dumped)"
php $FLAGS test-di-dumped.php
<?php
class Service {
private $service;
private $param;
public function __construct(Service $service, $param)
{
$this->service = $service;
$this->param = $param;
}
}
<?php
require 'vendor/autoload.php';
require 'service.php';
require 'dumped.php';
$start = microtime(true);
echo intval(memory_get_usage() / 1024).'K'."\n";
$container = new ProjectServiceContainer();
echo intval(memory_get_usage() / 1024).'K'."\n";
echo round(microtime(true) - $start, 6).'s'."\n";
<?php
require 'vendor/autoload.php';
require 'service.php';
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
$start = microtime(true);
echo intval(memory_get_usage() / 1024).'K'."\n";
$container = new ContainerBuilder();
$container->setParameter('param', 'foo');
$container
->register('service_1', 'Service')
->addArgument(null)
->addArgument('%param%');
foreach (range(2, 200) as $i) {
$container
->register('service_'.$i, 'Service')
->addArgument(new Reference('service_'.($i - 1)))
->addArgument('%param%');
}
echo intval(memory_get_usage() / 1024).'K'."\n";
echo round(microtime(true) - $start, 6).'s'."\n";
use Symfony\Component\DependencyInjection\Compiler\Compiler;
$compiler = new Compiler();
$compiler->compile($container);
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
$dumper = new PhpDumper($container);
file_put_contents('dumped.php', $dumper->dump());
<?php
require 'vendor/autoload.php';
require 'service.php';
$start = microtime(true);
echo intval(memory_get_usage() / 1024).'K'."\n";
$container = new Pimple();
$container['param'] = 'foo';
$container['service_0'] = null;
foreach (range(1, 200) as $i) {
$container['service_'.$i] = $container->share(function ($container) use ($i) {
return new Service($container['service_'.($i - 1)], $container['param']);
});
}
echo intval(memory_get_usage() / 1024).'K'."\n";
echo round(microtime(true) - $start, 6).'s'."\n";
@stof
Copy link

stof commented Oct 4, 2012

and this does not benchmark the use of the container, only its creation

@igorw
Copy link
Author

igorw commented Oct 4, 2012

Compilation is an optional step. I did not want to benchmark it in this case. But fair enough, benchmarking with compilation and actually accessing a service would be interesting things to benchmark as well.

@hellboy81
Copy link

which container should I choose?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment