public function createSubjectFromMetadata(SubjectMetadata $metadata) { $subject = new Subject($this, $metadata->getName()); $subject->setGroups($metadata->getGroups()); $subject->setSleep($metadata->getSleep()); $subject->setRetryThreshold($metadata->getRetryThreshold()); $subject->setOutputTimeUnit($metadata->getOutputTimeUnit()); $subject->setOutputTimePrecision($metadata->getOutputTimePrecision()); $subject->setOutputMode($metadata->getOutputMode()); $this->subjects[] = $subject; return $subject; }
private function runIterations(ExecutorInterface $executor, RunnerContext $context, SubjectMetadata $subject, ParameterSet $parameterSet, \DOMElement $variantEl) { $iterationCount = $context->getIterations($subject->getIterations()); $revolutionCount = $context->getRevolutions($subject->getRevs()); $warmupCount = $context->getWarmup($subject->getWarmUp()); $executorConfig = $this->executorRegistry->getConfig($context->getExecutor()); $iterationCollection = new IterationCollection($subject, $parameterSet, $iterationCount, $revolutionCount, $warmupCount, $context->getRetryThreshold($this->retryThreshold)); $this->logger->iterationsStart($iterationCollection); try { foreach ($iterationCollection as $iteration) { $this->runIteration($executor, $executorConfig, $iteration, $context->getSleep($subject->getSleep())); } } catch (\Exception $e) { $iterationCollection->setException($e); $this->logger->iterationsEnd($iterationCollection); $this->appendException($variantEl, $e); return; } $iterationCollection->computeStats(); $this->logger->iterationsEnd($iterationCollection); while ($iterationCollection->getRejectCount() > 0) { $this->logger->retryStart($iterationCollection->getRejectCount()); $this->logger->iterationsStart($iterationCollection); foreach ($iterationCollection->getRejects() as $reject) { $reject->incrementRejectionCount(); $this->runIteration($executor, $executorConfig, $reject, $context->getSleep($subject->getSleep())); } $iterationCollection->computeStats(); $this->logger->iterationsEnd($iterationCollection); } $stats = $iterationCollection->getStats(); foreach ($iterationCollection as $iteration) { $iterationEl = $variantEl->ownerDocument->createElement('iteration'); $iterationEl->setAttribute('net-time', $iteration->getResult()->getTime()); $iterationEl->setAttribute('rev-time', $iteration->getResult()->getTime() / $iteration->getRevolutions()); $iterationEl->setAttribute('z-value', $iteration->getZValue()); $iterationEl->setAttribute('memory', $iteration->getResult()->getMemory()); $iterationEl->setAttribute('deviation', $iteration->getDeviation()); $iterationEl->setAttribute('rejection-count', $iteration->getRejectionCount()); $variantEl->appendChild($iterationEl); } $statsEl = $variantEl->appendElement('stats'); foreach ($stats as $statName => $statValue) { $statsEl->setAttribute($statName, $statValue); } }
private function processSubject(SubjectMetadata $subject, $annotation) { if ($annotation instanceof Annotations\BeforeMethods) { $subject->setBeforeMethods($this->resolveValue($annotation, $subject->getBeforeMethods(), $annotation->getMethods())); } if ($annotation instanceof Annotations\AfterMethods) { $subject->setAfterMethods($this->resolveValue($annotation, $subject->getAfterMethods(), $annotation->getMethods())); } if ($annotation instanceof Annotations\ParamProviders) { $subject->setParamProviders($this->resolveValue($annotation, $subject->getParamProviders(), $annotation->getProviders())); } if ($annotation instanceof Annotations\Iterations) { $subject->setIterations($annotation->getIterations()); } if ($annotation instanceof Annotations\Sleep) { $subject->setSleep($annotation->getSleep()); } if ($annotation instanceof Annotations\Groups) { $subject->setGroups($this->resolveValue($annotation, $subject->getGroups(), $annotation->getGroups())); } if ($annotation instanceof Annotations\Revs) { $subject->setRevs($annotation->getRevs()); } if ($annotation instanceof Annotations\Warmup) { $subject->setWarmup($annotation->getRevs()); } if ($annotation instanceof Annotations\Skip) { $subject->setSkip(true); } if ($annotation instanceof Annotations\OutputTimeUnit) { $subject->setOutputTimeUnit($annotation->getTimeUnit()); $subject->setOutputTimePrecision($annotation->getPrecision()); } if ($annotation instanceof Annotations\OutputMode) { $subject->setOutputMode($annotation->getMode()); } }
private function runIterations(RunnerContext $context, SubjectMetadata $subject, ParameterSet $parameterSet, \DOMElement $variantEl) { $iterationCount = $context->getIterations($subject->getIterations()); $revolutionCount = $context->getRevolutions($subject->getRevs()); $iterationCollection = new IterationCollection($subject, $parameterSet, $context->getRetryThreshold($this->retryThreshold)); $this->logger->iterationsStart($iterationCollection); $iterations = $iterationCollection->spawnIterations($iterationCount, $revolutionCount); foreach ($iterations as $iteration) { $this->runIteration($iteration, $subject->getSleep()); $iterationCollection->add($iteration); } $iterationCollection->computeStats(); $this->logger->iterationsEnd($iterationCollection); while ($iterationCollection->getRejectCount() > 0) { $this->logger->retryStart($iterationCollection->getRejectCount()); $this->logger->iterationsStart($iterationCollection); foreach ($iterationCollection->getRejects() as $reject) { $reject->incrementRejectionCount(); $this->runIteration($reject, $context->getSleep($subject->getSleep())); } $iterationCollection->computeStats(); $this->logger->iterationsEnd($iterationCollection); } $stats = $iterationCollection->getStats(); foreach ($iterationCollection as $iteration) { $iterationEl = $variantEl->ownerDocument->createElement('iteration'); $iterationEl->setAttribute('revs', $iteration->getRevolutions()); $iterationEl->setAttribute('time-net', $iteration->getResult()->getTime()); $iterationEl->setAttribute('time', $iteration->getResult()->getTime() / $iteration->getRevolutions()); $iterationEl->setAttribute('z-value', $iteration->getZValue()); $iterationEl->setAttribute('memory', $iteration->getResult()->getMemory()); $iterationEl->setAttribute('deviation', $iteration->getDeviation()); $iterationEl->setAttribute('rejection-count', $iteration->getRejectionCount()); $variantEl->appendChild($iterationEl); } $statsEl = $variantEl->appendElement('stats'); foreach ($stats as $statName => $statValue) { $statsEl->setAttribute($statName, $statValue); } }
/** * It should set the warmup attribute in the DOM. */ public function testWarmup() { $subject = new SubjectMetadata($this->benchmark->reveal(), 'name', 0); $subject->setWarmup([50]); $this->benchmark->getSubjects()->willReturn([$subject]); TestUtil::configureBenchmarkMetadata($this->benchmark); $test = $this; $this->executor->execute(Argument::type('PhpBench\\Benchmark\\Metadata\\SubjectMetadata'), Argument::type('PhpBench\\Model\\Iteration'), $this->executorConfig)->will(function ($args) use($test) { $iteration = $args[1]; $test->assertEquals(50, $iteration->getVariant()->getWarmup()); $callback = $test->loadIterationResultCallback(); $callback($args); }); $suite = $this->runner->run(new RunnerContext(__DIR__, [])); $this->assertInstanceOf('PhpBench\\Model\\Suite', $suite); $this->assertNoErrors($suite); }
private function runSubject(ExecutorInterface $executor, RunnerContext $context, Subject $subject, SubjectMetadata $subjectMetadata) { $parameterSets = $context->getParameterSets($subjectMetadata->getParameterSets()); $paramsIterator = new CartesianParameterIterator($parameterSets); // create the variants. foreach ($paramsIterator as $parameterSet) { foreach ($subjectMetadata->getIterations() as $nbIterations) { foreach ($subjectMetadata->getRevs() as $revolutions) { foreach ($subjectMetadata->getWarmup() as $warmup) { $variant = $subject->createVariant($parameterSet, $revolutions, $warmup); $variant->spawnIterations($nbIterations); } } } } // run the variants. foreach ($subject->getVariants() as $variant) { $this->runVariant($executor, $context, $subjectMetadata, $variant); } return $subject; }
/** * {@inheritdoc} */ public function execute(SubjectMetadata $subjectMetadata, Iteration $iteration, Config $config) { $tokens = ['class' => $subjectMetadata->getBenchmark()->getClass(), 'file' => $subjectMetadata->getBenchmark()->getPath(), 'subject' => $subjectMetadata->getName(), 'revolutions' => $iteration->getVariant()->getRevolutions(), 'beforeMethods' => var_export($subjectMetadata->getBeforeMethods(), true), 'afterMethods' => var_export($subjectMetadata->getAfterMethods(), true), 'parameters' => var_export($iteration->getVariant()->getParameterSet()->getArrayCopy(), true), 'warmup' => $iteration->getVariant()->getWarmup() ?: 0]; $payload = $this->launcher->payload(__DIR__ . '/template/microtime.template', $tokens); return $this->launch($payload, $iteration, $config); }