* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Stopwatch; /** * Stopwatch provides a way to profile code. * * @author Fabien Potencier */ class Stopwatch { /** * @var bool */ private $morePrecision; /** * @var Section[] */ private $sections; /** * @var Section[] */ private $activeSections; /** * @param bool $morePrecision If true, time is stored as float to keep the original microsecond precision */ public function __construct($morePrecision = false) { $this->morePrecision = $morePrecision; $this->reset(); } /** * @return Section[] */ public function getSections() { return $this->sections; } /** * Creates a new section or re-opens an existing section. * * @param string|null $id The id of the session to re-open, null to create a new one * * @throws \LogicException When the section to re-open is not reachable */ public function openSection($id = null) { $current = end($this->activeSections); if (null !== $id && null === $current->get($id)) { throw new \LogicException(sprintf('The section "%s" has been started at an other level and can not be opened.', $id)); } $this->start('__section__.child', 'section'); $this->activeSections[] = $current->open($id); $this->start('__section__'); } /** * Stops the last started section. * * The id parameter is used to retrieve the events from this section. * * @see getSectionEvents() * * @param string $id The identifier of the section * * @throws \LogicException When there's no started section to be stopped */ public function stopSection($id) { $this->stop('__section__'); if (1 == count($this->activeSections)) { throw new \LogicException('There is no started section to stop.'); } $this->sections[$id] = array_pop($this->activeSections)->setId($id); $this->stop('__section__.child'); } /** * Starts an event. * * @param string $name The event name * @param string $category The event category * * @return StopwatchEvent */ public function start($name, $category = null) { return end($this->activeSections)->startEvent($name, $category); } /** * Checks if the event was started. * * @param string $name The event name * * @return bool */ public function isStarted($name) { return end($this->activeSections)->isEventStarted($name); } /** * Stops an event. * * @param string $name The event name * * @return StopwatchEvent */ public function stop($name) { return end($this->activeSections)->stopEvent($name); } /** * Stops then restarts an event. * * @param string $name The event name * * @return StopwatchEvent */ public function lap($name) { return end($this->activeSections)->stopEvent($name)->start(); } /** * Returns a specific event by name. * * @param string $name The event name * * @return StopwatchEvent */ public function getEvent($name) { return end($this->activeSections)->getEvent($name); } /** * Gets all events for a given section. * * @param string $id A section identifier * * @return StopwatchEvent[] */ public function getSectionEvents($id) { return isset($this->sections[$id]) ? $this->sections[$id]->getEvents() : array(); } /** * Resets the stopwatch to its original state. */ public function reset() { $this->sections = $this->activeSections = array('__root__' => new Section(null, $this->morePrecision)); } } __halt_compiler();----SIGNATURE:----cxstHl7xlrwynlLNNQb1ClB2SzAtRWgr9vXsKTPP51BqDXnT0Q5P2xBiA08MeTAQ+mokZ9kCKqFB3N7a9ww9Dllu7Fw6KbGWlg3JLy5scpk9JkCXSDVteEyV1zTpeALVSQFRwVw8/f9TOizoFzQ/JoZrWGLTicPZwb5lwrBnPoC4b75asOK/5NGu9zs1A1NPuwmnDl3+oOrWOUhhj9ztp9nzVXwimjzFGnfTL5OhP7DlpEqAa/9G7l4bRnc6s4ch2/jx/eEsLDFw2DQBUcNu9ntLPjFkAT+UEoVg8Au0mZd8+QwDdzuw365TLr8PQC730iUZEOaZuAKBDQMQOGXEiuN9HKe+/q3RmTrzBRaOGPJ7/0Nk/htTOqzPcOdsBJF+oU0MbrhpPtnIJIadNfoXV13GqsHRLHwqAZNabo+tLIoDxv0vdBMX8yEv+H9d1u78c8YHCSPIWve2uRqYct7yYnXOdLK0+PdmEK0JdBI8a2yHe/oK17rMkdsL+K1kapoI5w/sjT1ftSdgmG2rP2v+7RMJ5gbM6aCWHAZ4wurFg8aBoEd87IF98uxjzwQ7qGhA5Hvudphf7a3pZHLHtEeYtoczlBAAPIXptpPtqNlNuVZ6NT/YDRZ+yiUSFzTmZZLxDGJFSso8u9yJU3t0AxoT2ZdnEGN4M/YckGOiXLcnTy4=----ATTACHMENT:----MTcxNTg4OTAzMTYwODg0MCA3OTk0NDAwMDQ4MjY2OTkgMjM3MDcwMzI2MjY2Mzg5MQ==