基準測試

CodeIgniter 提供了兩個獨立的工具——計時器與疊代器,來幫助你測試你的程式以及不同的選項。計時器可以讓你輕鬆地計算出腳本執行的過程中,你所設定的兩個點之間的時間。疊代器讓你可以設定數種變化,並執行這些測試,執行效能與記憶體的統計,幫助你決定哪個版本是最好的。

計時器類別始終處於啟動狀態,從框架被呼叫的那一刻開始,直到將輸出響應給使用者之前,定時器才會停止統計,這使得整個系統執行時間的計算非常地精準。

使用計時器

透過計時器,你可以測量應用程式執行的過程中,任意兩個點之間的耗時,這會讓你在測量應用程式於不同方面的效能上變得非常容易。所有的測量都是透過 start()stop() 這兩個方法完成。

start() 方法只需要傳入一個參數,你可以使用任何字串作為計時器的名稱。它只是用來讓你參考,知道哪個測量記錄是哪個:

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

stop() 方法則是以你要停止的計時器名稱作為唯一的傳入參數:

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

這個名稱不區分大小寫,但必須與啟動計時器時給予的名稱相符。

另外,你也可以使用 全域函數 timer() 來啟動與停止計時器。

// 開始計時器
timer('render view');
// 如果以這個名子命名的計時器已經啟動
// 將停止計時器,
timer('render view');

查閱基準測試得分

當你的應用程式開始執行,你所設定的所有計時器都會被計時器類別蒐集起來,但它不會自動顯示這些計時器。你可以透過呼叫 getTimers() 方法來調閱所有的計時器。這個方法會回傳一個基準測試訊息的陣列,包括開始、結束與持續時間。

$timers = $benchmark->getTimers();

// Timers =
[
    'render view'  => [
        'start'    => 1234567890,
        'end'      => 1345678920,
        'duration' => 15.4315      // number of seconds
    ]
]

你可以透過傳入你所希望顯示的小數位數作為唯一的參數,用於改變計算出的持續時間的精度。預設值是小數點後四位。

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

計時器會自動顯示在 除錯工具列 上。

顯示執行時間

雖然 getTimers() 方法會提供專案中所有計時器的原始資料,但你也可以使用 getElapsedTime() 方法獲得單個計時器的持續時間,回傳的單位為秒。這個方法的第一個參數為需要顯示的計時器名稱,第二個參數為小數點後的位數,這個參數的預設值為 4 。

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

使用疊代器

疊代器是一個簡單的工具,設計這個工具的目的是為了讓你在一個解決方案上嘗試不同的變化,看看速度差異與不同的記憶體使用模式。你可以加入任意數量的「任務」讓它執行。類別將會執行著數百或數千次的任務,以計算更準確的效能。最後的結果可以被你查閱,也可以將它輸出為 HTML 表格。

指派欲執行的任務

任務是在匿名函數中被定義的,任務所創建的任何輸出都會被自動拋棄。任務透過 add() 方法加入到疊代器之中。第一個參數是你的測試的名稱,第二個參數才是匿名函數本身。

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

// 加入新的任務
$iterator->add('single_concat', function () {
    $str = 'Some basic'.'little'.'string concatenation test.';
});

// 加入另一項任務
$iterator->add('double', function ($a = 'little') {
    $str = "Some basic {$little} string test.";
});

執行任務

一旦你加入了欲執行的任務,你就可以透過 run() 方法來多次循環執行這些任務。在預設的情形下,它將對每個任務執行 1000 次。對於大多數的簡單測試來說這已經足夠了,但你若是需要更高的執行次數,你可以把這個數字當作第一個參數傳入至方法中。

// 執行測試 3000 次.
$iterator->run(3000);

一旦執行了疊代器,它將會回傳一個包含測試結果的 HTML 表格。如果你不希望將測試結果顯示出來,你可以在第二個參數中傳入 false :

// 不輸出結果到畫面
$iterator->run(1000, false);