dragon-code/benchmark

不同选项之间代码执行速度的简单比较

3.0.0 2024-03-23 00:45 UTC

README

the dragon code benchmark

Stable Version Unstable Version Total Downloads Github Workflow Status License

安装

要获取《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 -             
 ------- ------------------ ------------------ 
  • foobar - 传递数组中列的名称。用于识别。默认情况下,使用数组索引,从0开始。例如,1, 2, 3,.. N+1
  • 123, ..., N+1 - 验证迭代序列号。
  • 11.33 ms - 每次迭代的检查代码的执行时间。
  • 0b6.8Kb等。 - 检查代码使用的RAM量。
  • min - 最小代码处理时间。
  • max - 最大代码处理时间。
  • avg - 所有迭代中的算术平均值,通过消除10%的最小值和10%的最大值,以获得更准确的值,从而通过外部因素的潜在干预。
  • total - 检查所有代码迭代的总时间和内存使用。

许可证

本软件包遵循MIT许可证