プログラムの処理が重たい時、どこの処理で時間を食っているか調べたくなりますね。
そんな時はPHPの microtime関数を使うと簡単に処理時間の計測ができ、ボトルネックを発見できます。
microtime 関数とは
現在の Unix タイムスタンプをマイクロ秒まで返す関数です。
1 | mixed microtime ([ bool $get_as_float = false ] ) |
引数を指定しないか、falseを設定すると「文字列」でマイクロ秒を返します。
引数にtrueを設定すると「float(浮動小数点数)」で値を返します。
処理時間の計測をするためには開始時間と終了時間の差分を出したいので、常に引数はtrueを指定します。
参考
http://php.net/manual/ja/function.microtime.php
マイクロ秒ってどんな数字!?
マイクロ秒(マイクロセカンド、マイクロセック)とは、100万分の1秒のことで、非常に細かな時間です。「μs」や「us」や「usec」というふうに表記されます。
microtime 関数で処理速度を計測してみる
シンプルな計測方法
1 2 3 4 5 6 | <?php $start = microtime(true); sleep(1); // 何か処理をする $end = microtime(true); echo "処理時間:" . ($end - $start) . "秒"; ?> |
これを動かしてみるとこんな結果になります。
処理時間:1.0002000331879秒
複数箇所の計測方法
配列を使ってあげると複数箇所の計測も簡単に実装できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php $debug_time = array(); $debug_time[] = microtime(true); sleep(1); // 何か処理をする $debug_time[] = microtime(true); sleep(1); // 何か処理をする $debug_time[] = microtime(true); sleep(1); // 何か処理をする $debug_time[] = microtime(true); for($i=0; $i < (count($debug_time)-1); $i++) { echo "{$i}番目の処理に掛かった時間:"; echo ($debug_time[$i+1] - $debug_time[$i]) . "秒 <br>"; } ?> |
実行結果はこんな感じです。
0番目の処理に掛かった時間:1.0006420612335秒
1番目の処理に掛かった時間:1.0003950595856秒
2番目の処理に掛かった時間:1.0009589195251秒
精度について
ここまでmicrotime関数を使用した計測の仕方を書いてきましたが、より高い精度でmicrotime関数を使用するための考察をされている記事を見つけましたので紹介させていただきます。
高い精度をお求めの方はぜひ参考になされてください。
Unixタイムスタンプをマイクロ秒まで表現するには整数部10桁+小数部6桁の16桁必要ですがPHPのfloat値には約14桁の制度しかないのです
なるほどなぁ。ちなみに私の場合はザクっと処理時間が分かればいいかなぁ程度だったので、紹介記事のようにはしませんでした(^^;)ナンテコッタ
まとめ
microtime関数を使うことでお手軽に処理時間の計測ができます。
実行時間が長すぎて困っている方、デバッグのお供にどうぞ。