Stopwatch组件

3.4 版本
维护中的版本

Stopwatch组件提供了一种分析代码的方式。

安装 

你可以通过下述两种方式安装:

然后,包容vendor/autoload.php文件,以开启Composer提供的自动加载机制。否则,你的程序将无法找到这个Symfony组件的类。

用法 

Stopwatch组件提供了一个简单且一致的方式来测量特定部分代码的执行时间,以便你不必持续地自行解析微秒数。而是,使用简单的 Stopwatch 类:

1
2
3
4
5
6
7
use Symfony\Component\Stopwatch\Stopwatch;
 
$stopwatch = new Stopwatch();
// Start event named 'eventName' / 启动一个命名为'eventName'的事件
$stopwatch->start('eventName');
// ... some code goes here / ...此处执行一些代码
$event = $stopwatch->stop('eventName');

StopwatchEvent 对象可以从 start(), stop(), lap()getEvent() 方法中取出。最后这个方法,若你需要取出一个“正在运行中”的事件之耗时,应当使用它。

你也可以提供事件的类别名称(category name):

1
$stopwatch->start('eventName', 'categoryName');

你可以把类别当作事件的标签。例如,Symfony分析器工具(profiler tools)使用了分类,对不同事件使用了漂亮的颜色代码。

周期(Periods) 

就像你从现实中所知道的那样,所有的码表都两个键:一个是开始/结束,另一个就是测量lap time单圈时间。以下例程正是 lap() 所要做的:

1
2
3
4
5
6
7
8
9
$stopwatch = new Stopwatch();
// Start event named 'foo' / 启动'foo'事件
$stopwatch->start('foo');
// ... some code goes here / 执行代码
$stopwatch->lap('foo');
// ... some code goes here  / 执行代码
$stopwatch->lap('foo');
// ... some other code goes here / 执行代码
$event = $stopwatch->stop('foo');

每一圈的信息都被当作“周期”(periods)存放在事件中。要得到圈数信息,调用:

1
$event->getPeriods();

除了周期之外,你还可以从事件中得到其他有用的信息。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$event->getCategory();   // Returns the category the event was started in
                         // 返回事件启动时所属的分类
$event->getOrigin();     // Returns the event start time in milliseconds
                         // 返回事件启动时间,以毫秒计
$event->ensureStopped(); // Stops all periods not already stopped
                         // 停止所有尚未停止的周期
$event->getStartTime();  // Returns the start time of the very first period
                         // 返回最初的那个周期的启动时间
$event->getEndTime();    // Returns the end time of the very last period
                         // 返回最后的那个周期的结束时间
$event->getDuration();   // Returns the event duration, including all periods
                         // 返回事件的持续时间,包括所有周期
$event->getMemory();     // Returns the max memory usage of all periods
                         // 返回所有周期中的最大内存占用

区段(Sections) 

区段,是一种把时间线(timeline)给 “逻辑切割(logically split)” 成群组(groups)的一种方式。你可以看到Symfony是如何使用区段来把框架的生命周期在分析器工具中给漂亮地视图化的。以下是使用区段的一个基本样例:

1
2
3
4
5
6
7
$stopwatch = new Stopwatch();
 
$stopwatch->openSection();
$stopwatch->start('parsing_config_file', 'filesystem_operations');
$stopwatch->stopSection('routing');
 
$events = $stopwatch->getSectionEvents('routing');

通过调用 openSection() 方法并指定区段id,你可以重新开启一个section:

1
2
3
$stopwatch->openSection('routing');
$stopwatch->start('building_config_tree');
$stopwatch->stopSection('routing');

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)