/** * {@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)); }
/** * {@inheritdoc} */ public function launch(Payload $payload, Iteration $iteration, Config $options) { $phpConfig = ['max_execution_time' => 0]; $payload->setPhpConfig($phpConfig); $result = $payload->launch(); if (isset($result['buffer']) && $result['buffer']) { throw new \RuntimeException(sprintf('Benchmark made some noise: %s', $result['buffer'])); } $iteration->setResult(new TimeResult($result['time'])); $iteration->setResult(MemoryResult::fromArray($result['mem'])); }
/** * {@inheritdoc} */ public function launch(Payload $payload, Iteration $iteration, Config $config) { $outputDir = $config['output_dir']; $callback = $config['callback']; $name = XDebugUtil::filenameFromIteration($iteration, '.cachegrind'); $phpConfig = ['xdebug.profiler_enable' => 1, 'xdebug.profiler_output_dir' => PhpBench::normalizePath($outputDir), 'xdebug.profiler_output_name' => $name]; $payload->setPhpConfig($phpConfig); $result = $payload->launch(); if (isset($result['buffer']) && $result['buffer']) { throw new \RuntimeException(sprintf('Benchmark made some noise: %s', $result['buffer'])); } $callback($iteration, $result); $iteration->setResult(new TimeResult($result['time'])); $iteration->setResult(MemoryResult::fromArray($result['mem'])); return $result; }
/** * {@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', 'xdebug.collect_params' => '3']; $payload->setPhpConfig($phpConfig); $path = $dir . DIRECTORY_SEPARATOR . $name . '.xt'; // if the file exists, remove it. XDebug might not be installed // on the PHP binary and the file may not be generated. We should // fail in such a case and not use the file from a previous run. if ($this->filesystem->exists($path)) { $this->filesystem->remove($path); } $result = $payload->launch(); if (false === $this->filesystem->exists($path)) { throw new \RuntimeException(sprintf('Trace file at "%s" was not generated.', $path)); } $dom = $this->converter->convert($path); $subject = $iteration->getVariant()->getSubject(); $class = $subject->getBenchmark()->getClass(); // remove leading slash from class name for matching // the class in the trace. 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('number(%s/@end-time) - number(%s/@start-time)', $selector, $selector)) * 1000000.0); $memory = (int) $dom->evaluate(sprintf('number(%s/@end-memory) - number(%s/@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, $dom)); }