* @license MIT * * @group Performance * @coversNothing */ class LazyLoadingValueHolderPerformanceTest extends BaseLazyLoadingPerformanceTest { /** * @outputBuffering * @dataProvider getTestedClasses * * @param string $className * @param array $methods * @param array $properties * * @return void */ public function testProxyInstantiationPerformance($className, array $methods, array $properties) { $proxyName = $this->generateProxy($className); $iterations = 20000; $instances = array(); /* @var $proxies \ProxyManager\Proxy\VirtualProxyInterface[] */ $proxies = array(); $initializer = function ( & $valueHolder, VirtualProxyInterface $proxy, $method, $params, & $initializer ) use ($className) { $initializer = null; $valueHolder = new $className(); return true; }; $this->startCapturing(); for ($i = 0; $i < $iterations; $i += 1) { $instances[] = new $className(); } $baseProfile = $this->endCapturing( 'Instantiation for ' . $iterations . ' objects of type ' . $className . ': %fms / %fKb' ); $this->startCapturing(); for ($i = 0; $i < $iterations; $i += 1) { $proxies[] = new $proxyName($initializer); } $proxyProfile = $this->endCapturing( 'Instantiation for ' . $iterations . ' proxies of type ' . $className . ': %fms / %fKb' ); $this->compareProfile($baseProfile, $proxyProfile); $this->startCapturing(); foreach ($proxies as $proxy) { $proxy->initializeProxy(); } $this->endCapturing('Initialization of ' . $iterations . ' proxies of type ' . $className . ': %fms / %fKb'); foreach ($methods as $methodName => $parameters) { $this->profileMethodAccess($className, $instances, $proxies, $methodName, $parameters); } foreach ($properties as $property) { $this->profilePropertyWrites($className, $instances, $proxies, $property); $this->profilePropertyReads($className, $instances, $proxies, $property); $this->profilePropertyIsset($className, $instances, $proxies, $property); $this->profilePropertyUnset($className, $instances, $proxies, $property); } } /** * @return array */ public function getTestedClasses() { return array( array('stdClass', array(), array()), array('ProxyManagerTestAsset\\BaseClass', array('publicMethod' => array()), array('publicProperty')), ); } /** * {@inheritDoc} */ protected function generateProxy($parentClassName) { $generatedClassName = __NAMESPACE__ . '\\' . UniqueIdentifierGenerator::getIdentifier('Foo'); $generator = new LazyLoadingValueHolderGenerator(); $generatedClass = new ClassGenerator($generatedClassName); $strategy = new EvaluatingGeneratorStrategy(); $generator->generate(new ReflectionClass($parentClassName), $generatedClass); $strategy->generate($generatedClass); return $generatedClassName; } }