dragon-code / benchmark
不同选项之间代码执行速度的简单比较
3.0.0
2024-03-23 00:45 UTC
Requires
- php: ^8.2
- dragon-code/support: ^6.10
- symfony/console: ^6.0 || ^7.0
Requires (Dev)
- phpunit/phpunit: ^11.0
- symfony/var-dumper: ^6.0 || ^7.0
README
安装
要获取《Dragon Code: Benchmark》的最新版本,只需使用Composer引用项目
composer require dragon-code/benchmark --dev
或者手动更新composer.json
文件中的require-dev
块并运行composer update
控制台命令
{ "require-dev": { "dragon-code/benchmark": "^3.0" } }
使用
注意
执行结果将打印到控制台,所以请确保您从控制台调用代码。
use DragonCode\Benchmark\Benchmark; Benchmark::start()->compare( fn () => /* some code */, fn () => /* some code */, ); Benchmark::start()->compare([ fn () => /* some code */, fn () => /* some code */, ]); Benchmark::start()->compare([ 'foo' => fn () => /* some code */, 'bar' => fn () => /* some code */, ]);
结果示例
------- --------------------- --------------------
# 0 1
------- --------------------- --------------------
1 0.0101 ms - 64.8Kb 0.0014 ms - 13.7Kb
2 0.0099 ms - 59.5Kb 0.0011 ms - 12.9Kb
3 0.0014 ms - 59.1Kb 0.001 ms - 12.5Kb
4 0.0012 ms - 58.8Kb 0.0011 ms - 12.2Kb
5 0.0012 ms - 58.4Kb 0.0011 ms - 11.8Kb
6 0.0011 ms - 58Kb 0.001 ms - 11.4Kb
7 0.0011 ms - 57.6Kb 0.001 ms - 11Kb
8 0.0011 ms - 57.3Kb 0.001 ms - 10.7Kb
9 0.0012 ms - 56.6Kb 0.001 ms - 10Kb
...
100 0.0011 ms - 14.8Kb 0.0011 ms - 4.1Kb
------- --------------------- --------------------
min 0.001 ms - 14.8Kb 0.001 ms - 4.1Kb
max 0.0101 ms - 64.8Kb 0.0026 ms - 13.7Kb
avg 0.00122 ms - 47.5Kb 0.0016 ms - 4.1Kb
total 0.7998 ms 0.6156 ms
------- --------------------- --------------------
Order - 1 - - 2 -
------- --------------------- --------------------
在测量结果中的平均值时,如果使用了超过10次迭代,则最终数据将通过峰值值进行过滤。排除最低的10%和最高的10%值,以计算总结果,从而使最终数据更干净,对外部因素的依赖性更小。
迭代次数
默认情况下,基准测试为每个回调执行100次迭代,但您可以通过调用iterations
方法来更改此数字
use DragonCode\Benchmark\Benchmark; Benchmark::start() ->iterations(5) ->compare( fn () => /* some code */, fn () => /* some code */, );
如果传递的值小于1,则每个回调将执行一次迭代。
------- --------------------- ---------------------
# 0 1
------- --------------------- ---------------------
1 0.0077 ms - 64.8Kb 0.0015 ms - 57.3Kb
2 0.0023 ms - 59.5Kb 0.0013 ms - 56.5Kb
3 0.0013 ms - 59.1Kb 0.0012 ms - 56.1Kb
4 0.0012 ms - 58.8Kb 0.0011 ms - 55.8Kb
5 0.0011 ms - 58.4Kb 0.0011 ms - 55.4Kb
------- --------------------- ---------------------
min 0.0011 ms - 58.4Kb 0.0011 ms - 55.4Kb
max 0.0077 ms - 64.8Kb 0.0015 ms - 57.3Kb
avg 0.00272 ms - 60.1Kb 0.00124 ms - 56.2Kb
total 0.2453 ms 0.1105 ms
------- --------------------- ---------------------
Order - 2 - - 1 -
------- --------------------- ---------------------
您也可以从输入参数中获取当前执行迭代的数量
use DragonCode\Benchmark\Benchmark; Benchmark::start() ->iterations(5) ->compare( fn (int $iteration) => /* some code */, fn (int $iteration) => /* some code */, );
无数据
如果您只想查看运行时间的总结结果而无需每个迭代的详细信息,则可以调用withoutData
方法,该方法将仅显示总结信息
use DragonCode\Benchmark\Benchmark; Benchmark::start() ->withoutData() ->compare([ 'foo' => fn () => /* some code */, 'bar' => fn () => /* some code */, ]);
结果示例
------- ------------------- -------------------
# foo bar
------- ------------------- -------------------
min 12.02 ms - 58.4Kb 14.71 ms - 55.4Kb
max 15.66 ms - 64.8Kb 15.67 ms - 57.3Kb
avg 14.65 ms - 60.1Kb 15.17 ms - 56.2Kb
total 73.93 ms 76.31 ms
------- ------------------- -------------------
Order - 1 - - 2 -
------- ------------------- -------------------
注意
如果启用了显示详细信息的选项(未使用
withoutData
方法)并且请求的迭代次数超过1000,则将强制禁用详细信息的输出,因为随着计算机负载的显著增加,这完全没有意义。
四舍五入精度
默认情况下,脚本不进行四舍五入测量结果,但您可以指定可以执行四舍五入的小数位数。
例如
use DragonCode\Benchmark\Benchmark; Benchmark::start() ->iterations(5) ->round(2) ->compare( fn () => /* some code */, fn () => /* some code */, );
结果示例
------- ------------------ ------------------
# 0 1
------- ------------------ ------------------
1 11.85 ms - 0b 15.22 ms - 0b
2 14.56 ms - 0b 14.94 ms - 0b
3 15.4 ms - 0b 14.99 ms - 0b
4 15.3 ms - 0b 15.24 ms - 0b
5 14.76 ms - 0b 15.14 ms - 0b
------- ------------------ ------------------
min 11.85 ms - 0b 14.94 ms - 0b
max 15.4 ms - 0b 15.24 ms - 0b
avg 14.37 ms - 0b 15.11 ms - 0b
total 73.47 ms 76.03 ms
------- ------------------ ------------------
Order - 1 - - 2 -
------- ------------------ ------------------
准备数据
在某些情况下,在开始每个检查周期之前调用某些操作变得必要,以便其时间不包含在运行时间检查的结果中。为此有一个prepare
方法
use DragonCode\Benchmark\Benchmark; Benchmark::start() ->prepare(fn () => /* some code */) ->compare( fn () => /* some code */, fn () => /* some code */, );
在调用回调时,将名称和迭代参数传递给它。如果需要,您可以在回调函数内部使用这些信息。
use DragonCode\Benchmark\Benchmark; Benchmark::start() ->prepare(fn (mixed $name, int $iteration) => /* some code */) ->compare( fn () => /* some code */, fn () => /* some code */, );
您也可以从输入参数中获取当前迭代的数量和预调函数的执行结果
use DragonCode\Benchmark\Benchmark; Benchmark::start() ->prepare(fn (mixed $name, int $iteration) => /* some code */) ->compare( fn (int $iteration, mixed $prepareResult) => /* some code */, fn (int $iteration, mixed $prepareResult) => /* some code */, );
信息
------- ------------------ ------------------
# foo bar
------- ------------------ ------------------
1 11.33 ms - 0b 14.46 ms - 0b
2 14.63 ms - 0b 14.8 ms - 0b
3 14.72 ms - 0b 15.02 ms - 0b
4 15.28 ms - 0b 15.04 ms - 0b
N+1 15.03 ms - 0b 15.09 ms - 0b
------- ------------------ ------------------
min 11.33 ms - 0b 14.46 ms - 0b
max 15.28 ms - 0b 15.09 ms - 0b
avg 14.2 ms - 0b 14.88 ms - 0b
total 71.62 ms 75.12 ms
------- ------------------ ------------------
Order - 1 - - 2 -
------- ------------------ ------------------
foo
,bar
- 传递数组中列的名称。用于识别。默认情况下,使用数组索引,从0开始。例如,1, 2, 3,.. N+1
。1
,2
,3
, ...,N+1
- 验证迭代序列号。11.33 ms
- 每次迭代的检查代码的执行时间。0b
,6.8Kb
等。 - 检查代码使用的RAM量。min
- 最小代码处理时间。max
- 最大代码处理时间。avg
- 所有迭代中的算术平均值,通过消除10%的最小值和10%的最大值,以获得更准确的值,从而通过外部因素的潜在干预。total
- 检查所有代码迭代的总时间和内存使用。
许可证
本软件包遵循MIT许可证。