8ctopus / nano-timer
测量事件之间的时间、变异性并比较结果。
4.1.0
2024-08-01 11:59 UTC
Requires
- php: >=8.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.8
- phpmd/phpmd: ^2.13
- phpstan/phpstan: ^1.9
- phpunit/phpunit: ^9.5|^10.0
README
又一个PHP计时器
为什么还需要另一个计时器?
我构建这个计时器的主要原因是为了分析生产服务器上偶尔发生的慢请求,在这些请求中,使用如XDebug或php 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%