[Utility.php] PHPの実行速度を計測する方法

Utility.phpに記述しておきたいfunctionを掲載しています。

今回は、プログラムの実行時間を調べる方法と合わせて、Utility.phpに記述しておきたい【現在の時間を取得するfunction()】を紹介いたします。

PHPに限らず、プログラムには次のような特徴があります。
【同じ結果を得るためでも、コードの記述方法は無数にある】
ってことです。

現実の世界で例えてみると、大阪から東京に移動するために、「電車で行く」「新幹線で行く」「寝台電車でいく」「深夜バスで行く」「飛行機で行く」など、お財布と時間を天秤にかけて自分にとってベストな方法を用いることになるかと思います。
ただ、「東京に行く」って目的を達成するだけでも、これだけの方法があるわけです。

同じようにプログラムにも、【目的を達成する方法】は無数に用意されています。
そもそもwebのシステムを作るなら、PHPじゃなく、perlでも、Rubyでも、C/C++でもなんでも良いわけです。使用する言語を選ぶって時点で既に、これだけの選択肢があります。

まぁこのブログの主はPHPなので、PHPを使っての説明になりますが・・・。

本ブログでは、いくつかのテストコードを掲載しています。
【テストコード】には、コードAとコードBがあり、どちらも同じ目的を行うコードですが、AとBどっちのコードのほうが処理速度が速いのだろう?という疑問を解決するための内容を掲載しています。

で、このエントリの目的は、ABどっちのコードが早いのか、ではなく、ABの処理に掛かっている処理時間をどうやって取得するのか?を紹介いたします。

うーん。。。相変わらず前置きが駄文ですが、そんなこんなで、、、

PHPの実行速度を計測する方法

define('C_DECIMALS', 7); // 小数点以下の桁数

// for文のテスト
// 現在の開始時間を格納
$startTime = getMicrotime(); // PHP4,5 互換
//$startTime = microtime(true); // PHP5 以上
// 計測したい処理を書く
$hoge = 0;
for ($i = 0; $i < 1000; $i++){
  $hoge += $i;
}
// 計測完了時の時間を格納
$endTime = getMicrotime(); // PHP4,5 互換
//$endTime = microtime(true); // PHP5 以上

// [終了した時間]と[開始した時間]の差が実際に掛かった時間。
echo number_format($endTime - $startTime, C_DECIMALS) . '<hr />';

// while文のテスト
$startTime = getMicrotime(); // 現在の開始時間を格納
// 計測したい処理を書く
$hoge = 0;
$i = 0;
while ($i &lt; 1000){
  $hoge += $i++;
}
// 計測完了時の時間を格納
$endTime = getMicrotime(); // PHP4,5 互換

// [終了した時間]と[開始した時間]の差が実際に掛かった時間。
echo number_format($endTime - $startTime, C_DECIMALS) . '<hr />';

/*
 * 現在の時間を、マイクロ秒単位で取得
 * PHP4, 5 互換
 * PHP5 以上なら、 microtime(true); で同じ結果が取得できる
 */
function getMicrotime()
{
	list($msec, $sec) = explode(" ", microtime());
	return ((float)$sec + (float)$msec);
}

getMicrotime()は、現在の時間をマイクロ秒単位で取得します。
ちなみになんでこんなfunction()になるかっていうと、PHPのマニュアル【microtime】のサンプルにそう書いているので。。

PHP5以上の環境なら、microtime(true); と、引数にtrueを渡してやれば、getMicrotime()と同じ結果が得られます。PHP4は、microtime()に引数を渡す形はサポートされていないので、getMicrotime()が必要になります。

上記のコードでは、【1000回繰り返す処理時間の比較】を行っています。
繰り返し関数である、for文とwhile文の比較です。

計測方法はすごく単純で、対象の処理をする直前で現在の時間を変数Aに取得し、対象の処理終了後に現在の時間を変数Bに取得します。
で、終了のBと開始のAの差を求めたものが、実際に掛かった時間となるわけです。
マイクロ秒まで取得するため小数点以下が長ったらしいかと思ったので、出力時にnumber_format()で少数をまるめていますが、、、このへんは現場の雰囲気で(^^;)

ってか、PHP5以上なら、現在の時間を取得する方法すらも、getMicrotime()とmicrotime(true)の2種類あるわけで。。。