PHPで関数やコードの実行速度を検証・比較してみたい時にコピペで使るコードをメモしておこうと思います。

echoとprintはどっちが速いのかとか、nullチェックはどれが一番速いのかとか、気になったことは自分で計測してみるのが一番です!

目次
自分の価値を生み出すWordPressテーマ、SWELL

【限定セール中!】ブログ向けWordPressテーマを開発しました!

実行速度計測コード1(詳細な検証)

まず先に、計測コードの全貌を載せておきます。説明はあとから。

実行速度計測コード1

<?php
    define('DO_COUNT', 10000);      //実行回数
    define('TEST_COUNT', 100);      //計測回数
    define('DECIMAL_DIGITS', 10);   //小数点桁数
    $all_time = 0.0;                //全体の計測時間

    for($i = 0; $i < TEST_COUNT; $i++) {

        $start = microtime(true);  //計測前の現在時刻を取得
        for($j = 0; $j < DO_COUNT; $j++) {

            /* 10000回実行する内容 */

        }
        $end = microtime(true);      //計測後の現在時刻を取得

        $test_time = $end - $start;  //10000回の実行にかかった時間
        $all_time += $test_time;     //全体の計測時間に加算
    }

    //100回計測した時の平均値を計算し、出力
    $average = number_format($all_time / TEST_COUNT, DECIMAL_DIGITS);
    echo '平均:'.$average.'秒';
?>

参考元コード:PHP速度対決!差が出る5パターン

実際に使うときは、実行回数・計測回数を好きにアレンジして、コメントを削除してお使いください。

コードの流れ

ざっくりとだけ説明しておきます。

  1. 計測対象を10000回繰り返し実行
  2. この時、10000回実行するのにかかった時間を計測しておく
  3. 上記を100回繰り返した時の平均時間を計算し、出力する

定数・変数の説明

  • DO_COUNT:1度の計測に何回実行するか。
  • TEST_COUNT:計測を何回行うか
  • DECIMAL_DIGITS:最終的に出力する平均時間の有効小数点桁数
  • $all_time:全ての計測にかかる時間
  • $test_time:1度の計測にかかった時間
  • $average:1度の計測にかかった時間の平均

計測のポイント

実行速度の計算方法はいたってシンプルです。

microtime()という関数で現在時刻(Unixスタンプ形式)をマイクロ秒まで取得できるので、計測前と計測後に現在時刻を取得しておき、「計測後の時刻 - 計測前の時刻」を計算するだけです。

「10時10分10秒」に計測を開始し、計測が終わった時刻が「10時10分15秒」だったら、計測に5秒かかりましたよ、というのをもっと細かい数値で計算しています。

実行速度計測コード2(シンプル版)

先ほどのものよりもう少しシンプルに、単純に検証コードを1万回実行した時のタイムを表示するためのコードを関数化してみました。

実行速度計測用関数

/**
 * 関数化
 */
function benchmark(callable $fn,$name,$count = 10000) {

    $DO_COUNT       =  $count; //試行回数
    $DECIMAL_DIGITS =  10;     //小数点桁数

    $start = microtime(true);  //計測前の現在時刻を取得
    for($j = 0; $j < $DO_COUNT; $j++) {

        $fn();

    }
    $end = microtime(true);      //計測後の現在時刻を取得

    $test_time = $end - $start;  //10000回の実行にかかった時間


    //100回計測した時の平均値を計算し、出力
    $average = number_format($test_time, $DECIMAL_DIGITS);
    echo $name . ' : ' . $average . '秒';
}


/**
 * 使い方
 */
benchmark(function(){
    //検証したいコード1
},"検証1");

benchmark(function(){
    //検証したいコード2
},"検証2");

関数化しておくと使いやすいですね!

- Thank you for reading. -

コメント

コメントする