private function runBenchmark(ExecutorInterface $executor, RunnerContext $context, Benchmark $benchmark, BenchmarkMetadata $benchmarkMetadata) { if ($benchmarkMetadata->getBeforeClassMethods()) { $executor->executeMethods($benchmarkMetadata, $benchmarkMetadata->getBeforeClassMethods()); } // the keys are subject names, convert them to numerical indexes. $subjectMetadatas = array_filter($benchmarkMetadata->getSubjects(), function ($subjectMetadata) { if ($subjectMetadata->getSkip()) { return false; } return true; }); $subjectMetadatas = array_values($subjectMetadatas); foreach ($subjectMetadatas as $subjectMetadata) { // override parameters $subjectMetadata->setIterations($context->getIterations($subjectMetadata->getIterations())); $subjectMetadata->setRevs($context->getRevolutions($subjectMetadata->getRevs())); $subjectMetadata->setWarmup($context->getWarmup($subjectMetadata->getWarmUp())); $subjectMetadata->setSleep($context->getSleep($subjectMetadata->getSleep())); $subjectMetadata->setRetryThreshold($context->getRetryThreshold($this->retryThreshold)); $benchmark->createSubjectFromMetadata($subjectMetadata); } $this->logger->benchmarkStart($benchmark); foreach ($benchmark->getSubjects() as $index => $subject) { $subjectMetadata = $subjectMetadatas[$index]; $this->logger->subjectStart($subject); $this->runSubject($executor, $context, $subject, $subjectMetadata); $this->logger->subjectEnd($subject); } $this->logger->benchmarkEnd($benchmark); if ($benchmarkMetadata->getAfterClassMethods()) { $executor->executeMethods($benchmarkMetadata, $benchmarkMetadata->getAfterClassMethods()); } }