[PHP]microtimeでの処理時間計測がうまくいかない

JavaScript&php
ぽんきち
ぽんきち

microtime()で処理時間を計測しようと思ったけど秒数の表示がおかしくなる。。。泣

勉強中<br>プログラマーさん
勉強中
プログラマーさん

もしかしてこんな感じのやつ?

3.2901763916016E-5

ぽんきち
ぽんきち

そう!それ!

一体何秒なんだにゃ!

勉強中<br>プログラマーさん
勉強中
プログラマーさん

落ち着いてw

一つずつ見ていこうか

phpの処理時間を計測する必要があり、計測方法について検索してみるとmicrotime()をオススメする記事が多く見つかりました。ただ、いざ使ってみたら3.2901763916016E-5などと、なんだか想定と違う表示になって訳がわからなくなったので調べてみた。

microtime()での計測方法

そもそもmicrotime()は現在のUnixタイムスタンプをマイクロ秒単位で返してくれます。

参考ページ

PHP: microtime - Manual


この性質を使って処理の前後にmicrotime()を設置すると、その差分で処理時間を計測することができます。


こんな感じ

// 開始
$start = microtime(true);


// ここでなんらかの処理を行う


// 終了
$end = microtime(true);

// 差を出力
echo "処理時間は" . ($end - $start) . "秒です";

この時、期待される出力結果として

「処理時間は0.01326524532秒です」

のような表示を想定していましたが、実際に出力されたのは

「処理時間は3.2901763916016E-5秒です」

でした。

いや3秒もかかっているわけないし、なんならE-5ってなんだよ。。。ってなりました。

これはどうやら自分の処理時間が短すぎたために起きていたようでした。なのである程度コードを書いてから計測を行う場合にはこの状況には陥らないみたいです。

microtime(true)と浮動小数点数について

参考コードに使われてるmicrotime()のtrueという引数は、結果をfloat型(浮動小数点数)で返してくれるようになります。そのおかげで$end – $start という計算ができるんですね。

ちなみに引数を設定しないと文字列で返ってきます。

参考記事:https://zenn.dev/tusi/articles/6db417f713da3e

この浮動小数点数というのがミソで、自分は単純に「小数点以下も表示してくれるんだな〜」程度に考えていましたが、どうやらそうではないようです。

phpリファレンス:https://www.php.net/manual/ja/language.types.float.php
teratail:https://teratail.com/questions/65443



どうやらサーバーでの浮動小数点数の表記は0.0001未満になると、指数標記に変換されてしまうようです。

なので「3.2901763916016E-5」という表示は実際には「0.000032901763916016」を表しているらしく前述した通り、処理時間が短すぎたために浮動小数点数の表記が変換されていたというのが理由でした。


理由は分かったけど流石に変換された表記のままでは結局何秒かかっているか分からないので、秒数に変換する方法を最後にご紹介したいと思います。

指数表記から秒数への変換

変換方法はとっても簡単です。

// printfで変換しながら出力する

printf("%0.16f",($end - $start));


// sprintfで変換した後に出力する

var_dump(sprintf('%0.16F',$end - $start));

printf,もしくはsprintf関数を使用すると指定する引数に沿った出力をしてくれます。
見本のコードでは小数点以下 16桁を実数で出力して!というものです。

参考:https://it-kyujin.jp/article/detail/1569/


あまりないパターンかもしれませんが、microtime()の出力に困ったとき、役立てれば幸いです。

コメント

タイトルとURLをコピーしました