8ctopus/nano-timer

测量事件之间的时间、变异性并比较结果。

4.1.0 2024-08-01 11:59 UTC

README

packagist downloads min php version license tests code coverage badge lines of code

又一个PHP计时器

为什么还需要另一个计时器?

我构建这个计时器的主要原因是为了分析生产服务器上偶尔发生的慢请求,在这些请求中,使用如XDebugphp SPX这样的工具并不合适。

特性

  • 测量事件之间的时间
  • 测量相同代码循环的变异性
  • 比较结果
  • 仅记录超过给定阈值的请求
  • 自动记录析构函数调用
  • 测量峰值内存使用

安装

  • composer require 8ctopus/nano-timer

演示

项目根目录中有一个demo.php文件,展示了以下大多数示例。

简单的时间测量

use Oct8pus\NanoTimer\NanoTimer;

require_once __DIR__ . '/vendor/autoload.php';

$timer = new NanoTimer();

usleep(200000);

$timer->measure('usleep 200ms');

foreach (range(0, 50000) as $i) {
    $a = $i * $i;
}

$timer->measure('range 0-50000');

echo $timer->table();
usleep 200ms  211ms
range 0-50000  12ms
total         223ms

更高级的时间测量

  • 记录自动加载和构造函数时间
  • 记录峰值内存使用
use Oct8pus\NanoTimer\NanoTimer;

// autoload and constructor time
$hrtime = hrtime(true);

require_once __DIR__ . '/vendor/autoload.php';

$timer = new NanoTimer($hrtime);

$timer
    ->logMemoryPeakUse(true);

$timer->measure('autoload and constructor');

usleep(200000);

$timer->measure('200ms sleep');

sleep(1);

$timer->measure('1s sleep');

foreach (range(0, 50000) as $i) {
    $a = $i * $i;
}

$timer->measure('pow range 0-50000');

echo $timer->table();
autoload and constructor   23ms
200ms sleep               211ms
1s sleep                 1012ms
pow range 0-50000          13ms
total                    1259ms
memory peak use             4MB

仅记录慢于

有时仅记录慢于给定阈值的测量是有用的。在这个例子中,如果总耗时超过100毫秒,则在调用析构函数时,请求将自动记录到错误日志中。

$timer = new NanoTimer();

$timer
    ->logSlowerThan(100)
    ->autoLog();

...
nanotimer - total: 614ms - destruct: 614ms

测量变异性

有时你需要了解相同代码循环的速度变异性。

$variability1 = new NanoVariability();

for ($i = 1; $i < 6; ++$i) {
    $ms = (1000 + rand(0, +200)) * 10;
    usleep($ms);
    $variability1->measure("lap {$i}");
}

echo $variability1->table(true) . "\n";
lap 1   13ms
lap 2   16ms
lap 3   16ms
lap 4   16ms
lap 5   15ms
average 15ms
median  16ms
minimum 13ms
maximum 16ms

比较

可以比较时间和变异性结果。

$v1 = new NanoVariability();

for ($i = 1; $i < 6; ++$i) {
    usleep(500 + rand(0, 100));
    $v1->measure("lap {$i}");
}

$v2 = new NanoVariability();

for ($i = 1; $i < 6; ++$i) {
    usleep(500 + rand(0, 100));
    $v2->measure("lap {$i}");
}

$compare = new Compare($v1, $v2);
compare
lap 1     7 13 +86%
lap 2    15 15 +0%
lap 3    15 15 +0%
lap 4    15 15 +0%
lap 5    15 16 +7%
average  13 15 +15%
median   15 15 +0%
minimum   7 13 +86%
maximum  15 16 +7%