/**
* {@inheritdoc}
*/
public function launch(Payload $payload, Iteration $iteration, Config $config)
{
$name = XDebugUtil::filenameFromIteration($iteration);
$dir = $config['output_dir'];
$phpConfig = ['xdebug.trace_output_name' => $name, 'xdebug.trace_output_dir' => $dir, 'xdebug.trace_format' => '1', 'xdebug.auto_trace' => '1', 'xdebug.coverage_enable' => '0'];
$payload->setPhpConfig($phpConfig);
$path = $dir . DIRECTORY_SEPARATOR . $name . '.xt';
$result = $payload->launch();
if (false === $this->filesystem->exists($path)) {
throw new \RuntimeException(sprintf('Trace file at "%s" was not generated. Is XDebug enabled in the benchmarking environment', $path));
}
$dom = $this->converter->convert($path);
$subject = $iteration->getVariant()->getSubject();
$class = $subject->getBenchmark()->getClass();
if (substr($class, 0, 1) == '\\') {
$class = substr($class, 1);
}
// extract only the timings for the benchmark class, ignore the bootstrapping
$selector = '//entry[@function="' . $class . '->' . $subject->getName() . '"]';
// calculate stats from the trace
$time = (int) ($dom->evaluate(sprintf('sum(%s/@end-time) - sum(/@start-time)', $selector, $selector)) * 1000000.0);
$memory = (int) $dom->evaluate(sprintf('sum(%s/@end-memory) - sum(/@start-memory)', $selector, $selector));
$funcCalls = (int) $dom->evaluate('count(' . $selector . '//*)');
$iteration->setResult(new TimeResult($result['time']));
$iteration->setResult(MemoryResult::fromArray($result['mem']));
$iteration->setResult(new XDebugTraceResult($time, $memory, $funcCalls));
}