ベンチマーク

CodeIgniter は、コードのベンチマークと異なるオプションのテストに役立つ 2 つのツール、**タイマー**と**イテレーター**を提供します。タイマーを使用すると、スクリプト実行中の 2 つの時点間の時間を簡単に計算できます。イテレーターを使用すると、いくつかのバリエーションを設定してそれらのテストを実行し、パフォーマンスとメモリ統計を記録して、どのバージョンが最適かを判断するのに役立ちます。

タイマークラスは常にアクティブであり、フレームワークが呼び出された瞬間からユーザーに出力を送信する直前まで開始され、システム全体の実行時間を非常に正確に計ることができます。

タイマーの使用

タイマーを使用すると、アプリケーションの実行中の 2 つの時点間の時間を測定できます。これにより、アプリケーションのさまざまな側面のパフォーマンスを簡単に測定できます。すべての測定は、`start()` メソッドと `stop()` メソッドを使用して行われます。

Timer::start()

`start()` メソッドは、このタイマーの名前という 1 つのパラメーターを取ります。タイマーの名前には任意の文字列を使用できます。後でどの測定値がどれであるかを知るための参照としてのみ使用されます。

<?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()` メソッドも使用できます。パラメーターのない callable を受け取り、その実行時間を測定します。`start()` メソッドと `stop()` メソッドは、関数呼び出しの前後で自動的に呼び出されます。

<?php

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

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

さらに処理するために、callable の戻り値を返すこともできます。

<?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');
*/

callable を 2 番目のパラメーターとして `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()` メソッドを使用して、単一タイマーの期間を秒単位で取得できます。最初のパラメーターは表示するタイマーの名前です。2 番目は表示する小数点以下の桁数です。これはデフォルトで 4 です。

<?php

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

イテレーターの使用

イテレーターは、ソリューションの複数のバリエーションを試して、速度の違いやメモリ使用パターンを確認できるように設計されたシンプルなツールです。実行する「タスク」をいくつでも追加でき、クラスはタスクを数百回または数千回実行して、パフォーマンスのより明確な全体像を把握します。結果は、スクリプトによって取得して使用したり、HTML テーブルとして表示したりできます。

実行するタスクの作成

タスクはクロージャ内で定義されます。タスクが作成する出力はすべて自動的に破棄されます。`add()` メソッドを使用して、イテレータークラスにタスクを追加します。最初のパラメーターはこのテストを参照するために使用する名前です。2 番目のパラメーターはクロージャ自体です。

<?php

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

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

タスクの実行

実行するタスクを追加したら、`run()` メソッドを使用して、タスクを何度もループできます。デフォルトでは、各タスクを 1000 回実行します。これは、ほとんどの単純なテストではおそらく十分です。テストをそれ以上実行する必要がある場合は、最初のパラメーターとして数値を渡すことができます。

<?php

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

実行が完了すると、テスト結果を含む HTML テーブルが返されます。結果が不要な場合は、2 番目のパラメーターとして `false` を渡すことができます。

<?php

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