green-elephpant/code-bench

代码基准工具

v1.0.0 2024-09-08 15:58 UTC

This package is auto-updated.

Last update: 2024-09-08 16:00:17 UTC


README

Green ElePHPant

Green ElePHPant - CodeBench

Green ElePHPant 想要帮助您降低软件的碳排放。

实现这一目标的一种方式是优化性能。更少的CPU、RAM和存储意味着降低能耗,减少碳排放,并减少硬件生产。最重要的是,您的软件用户将受益于更快的应用程序。

GreenElephpant\CodeBench 是一个简单的基准工具,可以帮助您通过基准测试几种可能的解决方案来提高代码的性能,并帮助您决定选择哪种代码。

关键概念

GreenElephpant\CodeBench 简单地测量包含您想要测量的代码的可调用对象的执行时间和内存消耗。

感谢 PhpBench,如果您需要超级精确的测量,它是一个更好的解决方案,因为它将待测代码独立运行。它还旨在用作类似于PHPUnit的测试套件,因此可以用于在CI/CD期间捕获性能回归,这使得它非常有用。然而,如果只需要快速而粗略的测量来决定几种选项,那么GreenElephpant\CodeBench 是您的代码伴侣。

安装

只需使用 composer 将 GreenElephpant\CodeBench 添加到您的项目中

composer require green-elephpant/code-bench --dev

注意:我们在这里使用 require-dev,因为 GreenElephpant\CodeBench 不应在生产代码中使用。

注意:对于 Laravel,您可以使用 CodeBench Laravel 包。

注意: GreenElephpant\CodeBench 与 PHP 7.4+ 兼容,以支持大多数代码库。但是,只有从 PHP 8.2 开始,函数memory_reset_peak_usage 才可用。在更早的版本中,您将无法使用此工具监控峰值内存使用。

配置

GreenElephpant\CodeBench 被设计为不需要其他依赖项以保持其足迹较小,因此没有什么可做的。

设置日志器可调用

默认情况下,GreenElephpant\CodeBench 使用 print 进行日志记录。但是,您可以设置一个可调用对象,它接受输出并将其记录在您想要的位置。

例如,在 Laravel 中您可以这样做

CodeBench::$loggerCallable = function (string $text) {
    Log::debug($text);
};

以使用您定义的任何日志记录器。

注意: CodeBench Laravel 包为您做了这件事。

使用

基本用法

在最纯粹的形式中,使用方法就像以下函数调用一样简单

use GreenElephpant\CodeBench\CodeBench;

CodeBench::benchmark([
    function () {
        // The first option we want to test    
        date('D M d Y H:m:s');
    },
    function () {
        // The second option we want to test
        (new DateTime())->format('D M d Y H:m:s');
    }
]);

结果应该是类似这样的

Function 1
Time (seconds): 0.00000310 (Reference)
Memory (MB): 0.00000000 (Reference)
Memory Peak (MB): 0.00000000 (Reference)

Function 2
Time (seconds): 0.00000405 (=> 1.31x)
Memory (MB): 0.00000000 (=> 0.00x)
Memory Peak (MB): 0.00000000 (=> 0.00x)

输出是什么意思?

  • 时间(秒)告诉我们可调用对象执行所需的时间。由于示例只是一个简单的函数调用,所以只是几秒钟。
  • 内存(MB) 是可调用对象执行前后使用的内存之间的差异
  • 内存峰值(MB) 是可调用对象在其执行过程中所需的最大的内存量(即峰值)。由于 PHP 在执行过程中释放内存,因此如果您想找出可调用对象是否可以超过配置的 PHP 内存限制,则此测量更为重要。

迭代

多次调用结果可能有所不同。为了平衡任何异常值,我们可以运行多次迭代并取平均值。这种行为由$iterations参数控制。以下示例将每次调用运行100次。

CodeBench::benchmark([
    function () {
        date('D M d Y H:m:s');
    },
    function () {
        (new DateTime())->format('D M d Y H:m:s');
    }
], 100);

预运行调用

默认情况下,GreenElephpant\CodeBench在开始实际测量之前会先运行一次调用。这是为了避免例如缓存预热等副作用。要禁用此行为,请在运行基准测试时将$preRunCallable设置为false

CodeBench::benchmark([
    function () {
        date('D M d Y H:m:s');
    },
    function () {
        (new DateTime())->format('D M d Y H:m:s');
    }
], 100, false);