Skip to content

Commit

Permalink
feature #10198 [Stopwatch] Allow getting duration of events without c…
Browse files Browse the repository at this point in the history
…alling stop() (jochenvdv)

This PR was merged into the 2.5-dev branch.

Discussion
----------

[Stopwatch] Allow getting duration of events without calling stop()

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | [#10175](#10175)
| License       | MIT
| Doc PR        | [#3539](symfony/symfony-docs#3539)

Commits
-------

2efe461 Allow retrieving unstopped stopwatch events
d3d097d Include running periods in duration
  • Loading branch information
fabpot committed Feb 5, 2014
2 parents bcb5239 + 2efe461 commit 6dfdb97
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 1 deletion.
30 changes: 30 additions & 0 deletions src/Symfony/Component/Stopwatch/Stopwatch.php
Expand Up @@ -125,6 +125,18 @@ 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 A StopwatchEvent instance
*/
public function getEvent($name)
{
return end($this->activeSections)->getEvent($name);
}

/**
* Gets all events for a given section.
*
Expand Down Expand Up @@ -293,6 +305,24 @@ public function lap($name)
return $this->stopEvent($name)->start();
}

/**
* Returns a specific event by name
*
* @param string $name The event name
*
* @return StopwatchEvent The event
*
* @throws \LogicException When the event is not known
*/
public function getEvent($name)
{
if (!isset($this->events[$name])) {
throw new \LogicException(sprintf('Event "%s" is not known.', $name));
}

return $this->events[$name];
}

/**
* Returns the events from this section.
*
Expand Down
11 changes: 10 additions & 1 deletion src/Symfony/Component/Stopwatch/StopwatchEvent.php
Expand Up @@ -171,8 +171,17 @@ public function getEndTime()
*/
public function getDuration()
{
$periods = $this->periods;
$stopped = count($periods);
$left = count($this->started) - $stopped;

for ($i = 0; $i < $left; $i++) {
$index = $stopped + $i;
$periods[] = new StopwatchPeriod($this->started[$index], $this->getNow());
}

$total = 0;
foreach ($this->periods as $period) {
foreach ($periods as $period) {
$total += $period->getDuration();
}

Expand Down
16 changes: 16 additions & 0 deletions src/Symfony/Component/Stopwatch/Tests/StopwatchEventTest.php
Expand Up @@ -82,6 +82,22 @@ public function testDuration()
$this->assertEquals(200, $event->getDuration(), null, self::DELTA);
}

public function testDurationBeforeStop()
{
$event = new StopwatchEvent(microtime(true) * 1000);
$event->start();
usleep(200000);
$this->assertEquals(200, $event->getDuration(), null, self::DELTA);

$event = new StopwatchEvent(microtime(true) * 1000);
$event->start();
usleep(100000);
$event->stop();
$event->start();
usleep(100000);
$this->assertEquals(100, $event->getDuration(), null, self::DELTA);
}

/**
* @expectedException \LogicException
*/
Expand Down
10 changes: 10 additions & 0 deletions src/Symfony/Component/Stopwatch/Tests/StopwatchTest.php
Expand Up @@ -29,6 +29,7 @@ public function testStart()

$this->assertInstanceof('Symfony\Component\Stopwatch\StopwatchEvent', $event);
$this->assertEquals('cat', $event->getCategory());
$this->assertSame($event, $stopwatch->getEvent('foo'));
}

public function testIsStarted()
Expand Down Expand Up @@ -92,6 +93,15 @@ public function testLap()
$this->assertEquals(200, $event->getDuration(), null, self::DELTA);
}

/**
* @expectedException \LogicException
*/
public function testUnknownEvent()
{
$stopwatch = new Stopwatch();
$stopwatch->getEvent('foo');
}

/**
* @expectedException \LogicException
*/
Expand Down

0 comments on commit 6dfdb97

Please sign in to comment.