diff --git a/src/Util/Profiler.php b/src/Util/Profiler.php index 2d3da3a9c0..c8c5633718 100644 --- a/src/Util/Profiler.php +++ b/src/Util/Profiler.php @@ -32,6 +32,16 @@ class Profiler implements ContainerInterface */ private $rendertime; + /** + * True, if the Profiler should measure the whole rendertime including functions + * + * @return bool + */ + public function isRendertime() + { + return $this->rendertime; + } + /** * @param bool $enabled True, if the Profiler is enabled * @param bool $renderTime True, if the Profiler should measure the whole rendertime including functions @@ -119,18 +129,76 @@ class Profiler implements ContainerInterface $this->callstack['parser'] = []; } + /** + * Returns the rendertime string + * + * @return string the rendertime + */ + public function getRendertimeString() + { + $output = ''; + + if (!$this->enabled || !$this->rendertime) { + return $output; + } + + if (isset($this->callstack["database"])) { + $output .= "\nDatabase Read:\n"; + foreach ($this->callstack["database"] as $func => $time) { + $time = round($time, 3); + if ($time > 0) { + $output .= $func . ": " . $time . "\n"; + } + } + } + if (isset($this->callstack["database_write"])) { + $output .= "\nDatabase Write:\n"; + foreach ($this->callstack["database_write"] as $func => $time) { + $time = round($time, 3); + if ($time > 0) { + $output .= $func . ": " . $time . "\n"; + } + } + } + if (isset($this->callstack["cache"])) { + $output .= "\nCache Read:\n"; + foreach ($this->callstack["cache"] as $func => $time) { + $time = round($time, 3); + if ($time > 0) { + $output .= $func . ": " . $time . "\n"; + } + } + } + if (isset($this->callstack["cache_write"])) { + $output .= "\nCache Write:\n"; + foreach ($this->callstack["cache_write"] as $func => $time) { + $time = round($time, 3); + if ($time > 0) { + $output .= $func . ": " . $time . "\n"; + } + } + } + if (isset($this->callstack["network"])) { + $output .= "\nNetwork:\n"; + foreach ($this->callstack["network"] as $func => $time) { + $time = round($time, 3); + if ($time > 0) { + $output .= $func . ": " . $time . "\n"; + } + } + } + + return $output; + } + /** * Save the current profiling data to a log entry * - * @param LoggerInterface $logger The logger to save the current log + * @param LoggerInterface $logger The logger to save the current log * @param string $message Additional message for the log */ public function saveLog(LoggerInterface $logger, $message = '') { - // Write down the performance values into the log - if (!$this->enabled) { - return; - } $duration = microtime(true) - $this->get('start'); $logger->info( $message, @@ -149,57 +217,10 @@ class Profiler implements ContainerInterface ] ); - if (!$this->rendertime) { - return; + if ($this->isRendertime()) { + $output = $this->getRendertimeString(); + $logger->info($message . ": " . $output, ['action' => 'profiling']); } - - $o = ''; - if (isset($this->callstack["database"])) { - $o .= "\nDatabase Read:\n"; - foreach ($this->callstack["database"] as $func => $time) { - $time = round($time, 3); - if ($time > 0) { - $o .= $func . ": " . $time . "\n"; - } - } - } - if (isset($this->callstack["database_write"])) { - $o .= "\nDatabase Write:\n"; - foreach ($this->callstack["database_write"] as $func => $time) { - $time = round($time, 3); - if ($time > 0) { - $o .= $func . ": " . $time . "\n"; - } - } - } - if (isset($this->callstack["cache"])) { - $o .= "\nCache Read:\n"; - foreach ($this->callstack["cache"] as $func => $time) { - $time = round($time, 3); - if ($time > 0) { - $o .= $func . ": " . $time . "\n"; - } - } - } - if (isset($this->callstack["cache_write"])) { - $o .= "\nCache Write:\n"; - foreach ($this->callstack["cache_write"] as $func => $time) { - $time = round($time, 3); - if ($time > 0) { - $o .= $func . ": " . $time . "\n"; - } - } - } - if (isset($this->callstack["network"])) { - $o .= "\nNetwork:\n"; - foreach ($this->callstack["network"] as $func => $time) { - $time = round($time, 3); - if ($time > 0) { - $o .= $func . ": " . $time . "\n"; - } - } - } - $logger->info($message . ": " . $o, ['action' => 'profiling']); } /** diff --git a/tests/src/Util/ProfilerTest.php b/tests/src/Util/ProfilerTest.php index f242fd43c5..87796a2f37 100644 --- a/tests/src/Util/ProfilerTest.php +++ b/tests/src/Util/ProfilerTest.php @@ -177,5 +177,25 @@ class ProfilerTest extends MockedTest } $profiler->saveLog($this->logger, 'test'); + + $output = $profiler->getRendertimeString(); + + foreach ($data as $perf => $items) { + foreach ($items['functions'] as $function) { + // assert that the output contains the functions + $this->assertRegExp('/' . $function . ': \d+/', $output); + } + } + } + + /** + * Test if no rendertime is set + */ + public function testNoRenderTime() + { + $profiler = new Profiler(true, false); + + $this->assertFalse($profiler->isRendertime()); + $this->assertEmpty($profiler->getRendertimeString()); } }