基准测试

CodeIgniter 提供了两种独立的工具来帮助您对代码进行基准测试并测试不同的选项:计时器迭代器。计时器允许您轻松计算脚本执行中两个点之间的时间。迭代器允许您设置多个变体并运行这些测试,记录性能和内存统计信息,以帮助您确定哪个版本是最好的。

计时器类始终处于活动状态,从框架被调用那一刻开始,一直到将输出发送给用户之前,这使得整个系统执行的计时非常准确。

使用计时器

使用计时器,您可以测量应用程序执行过程中两个时刻之间的时间。这使得测量应用程序不同方面的性能变得简单。所有测量都是使用 start()stop() 方法完成的。

Timer::start()

start() 方法接受一个参数:此计时器的名称。您可以使用任何字符串作为计时器的名称。它仅用于您稍后引用以了解哪个测量是哪个。

<?php

$benchmark = \Config\Services::timer();
$benchmark->start('render view');

Timer::stop()

stop() 方法也只接受您要停止的计时器的名称作为参数。

<?php

$benchmark->stop('render view');

名称不区分大小写,但必须与您启动计时器时给定的名称匹配。

timer()

或者,您可以使用 全局函数 timer() 来启动和停止计时器。

<?php

// Start the timer
timer('render view');
// Stop a running timer,
// if one of this name has been started
timer('render view');

Timer::record()

版本 4.3.0 中新增。

从 v4.3.0 开始,如果您使用非常小的代码块进行基准测试,您也可以使用 record() 方法。它接受一个无参数的可调用对象并测量其执行时间。方法 start()stop() 将在函数调用前后自动调用。

<?php

$benchmark->record('slow_function', static function () { slow_function('...'); });

/*
 * Same as:
 *
 * $benchmark->start('slow_function');
 * slow_function('...');
 * $benchmark->stop('slow_function');
*/

您还可以返回可调用对象的返回值以进行进一步处理。

<?php

$length = $benchmark->record('string length', static fn () => strlen('CI4'));

/*
 * $length = 3
 *
 * Same as:
 *
 * $benchmark->start('string length');
 * $length = strlen('CI4');
 * $benchmark->stop('string length');
*/

将可调用对象作为第二个参数传递给 timer() 时,也具有相同的功能。

<?php

$length = timer('string length', static fn () => strlen('CI4'));

/*
 * $length = 3
 *
 * Same as:
 *
 * timer('string length');
 * $length = strlen('CI4');
 * timer('string length');
*/

查看您的基准点

当您的应用程序运行时,您设置的所有计时器都会被 Timer 类收集。但是,它不会自动显示它们。您可以通过调用 getTimers() 方法来检索所有计时器。这将返回一个包含基准信息的数组,包括开始时间、结束时间和持续时间。

<?php

$timers = $benchmark->getTimers();
/*
 * Produces:
 * [
 *     'render view'  => [
 *         'start'    => 1234567890,
 *         'end'      => 1345678920,
 *         'duration' => 15.4315, // number of seconds
 *     ]
 * ]
 */

您可以通过将要显示的小数位数作为唯一参数传递进来,来更改计算出的持续时间的精度。默认值为小数点后 4 位数字。

<?php

$timers = $benchmark->getTimers(6);

计时器会在 调试工具栏 中自动显示。

显示执行时间

虽然 getTimers() 方法会为您提供项目中所有计时器的原始数据,但您可以使用 getElapsedTime() 方法以秒为单位检索单个计时器的持续时间。第一个参数是要显示的计时器的名称。第二个参数是要显示的小数位数。默认值为 4 位。

<?php

echo timer()->getElapsedTime('render view');
// Displays: 0.0234

使用迭代器

迭代器是一个简单的工具,旨在让您尝试解决方案的多种变体,以查看速度差异和不同的内存使用模式。您可以添加任意数量的“任务”供其运行,该类将运行该任务数百或数千次,以更清晰地了解性能。然后可以检索结果并由您的脚本使用,或者以 HTML 表格的形式显示。

创建要运行的任务

任务在闭包中定义。任务创建的任何输出都会自动被丢弃。它们通过 add() 方法添加到 Iterator 类。第一个参数是您要用来引用此测试的名称。第二个参数是闭包本身。

<?php

$iterator = new \CodeIgniter\Debug\Iterator();

$iterator->add('double', static function ($word = 'little') {
    "Some basic {$word} string test.";
});

运行任务

将要运行的任务添加完毕后,您可以使用 run() 方法多次循环遍历这些任务。默认情况下,它将运行每个任务 1000 次。对于大多数简单的测试来说,这可能已经足够了。如果您需要运行测试的次数超过 1000 次,则可以将次数作为第一个参数传递。

<?php

// Run the tests 3000 times.
$htmlTable = $iterator->run(3000);

运行后,它将返回一个包含测试结果的 HTML 表格。如果您不想要结果,可以将 false 作为第二个参数传递。

<?php

// Returns null.
$iterator->run(1000, false);