- ベストアンサー
PHPのmicrotime()について
お世話になっております。 microtime()関数で、現在のタイムスタンプをマイクロ秒単位で取得できるので、 処理前後で、これの差を求めると、 処理時間が出るかと思います。 元の値の単位がマイクロ秒なので、 差をとってもマイクロ秒だと思うのですが、 出た結果は、体感として秒単位のようにも見えます。 実際、計算結果は秒単位であると解説しているサイトなんかもありますが、 本当に秒という認識で大丈夫でしょうか? 理由とともに教えていただければ幸いです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> $usec*1000000は、マイクロ秒を秒に直しているのだと思いますが、 こちらは取り出した時点の単位が「秒」のため 1 マイクロ秒が 0.000001 秒として取り出されますので、掛け算をして 0.000001 秒というデータを 1 マイクロ秒というデータにしています。 > $sec*1000000は、元の単位が秒なのにどうして掛ける必要がでてくるのでしょうか? こちらも取り出した時点での単位は「秒」ですので、マイクロ秒に変換しなければいけません。 1 秒は 1000000 マイクロ秒 ですから掛け算をおこなっています。
その他の回答 (4)
- t_ohta
- ベストアンサー率38% (5238/13706)
> PHPの公式サイトの以下の記述からそれを読めないのは私だけでしょうか。 このあたりは戻り値の現物を見て理解していくしか無いと思います。 ン十万円も払って使うような開発言語なら開発元に文句の一つも言いますが、無償提供されているモノの場合は作っている人も、資料を翻訳している人も半ばボランティアだったりもします。 また、資料を作った人のスキル次第で表現が微妙だったりもしますしね。 PHPの場合は使用例などが公式サイトに豊富に出ているのでその内容から理解していけますが、使用例などが無ければ言語自体のソースを調べたり、たくさん実験して実装内容を推測するしか無い場合もあります。
お礼
お忙しいところ、何度もご返信くださり、ありがとうございました。
- t_ohta
- ベストアンサー率38% (5238/13706)
> 取得できたデータは「秒」と理解できると思いますが これはデータの中身の「単位」を言われているのであれば数値の単位は秒で、少数を含めた全データはマイクロ秒をベースにした値が取れるという事になります。 マイクロ秒単位の整数でデータを扱おうとすると32bitの整数値では値が大きすぎて扱えません。 PHPの整数値は符号付き整数で32bit環境だと扱える最大値は 2,147,483,647 ですから、マイクロ秒単位のデータだとすると 2,147 秒間(35分強)しか表せません。 64bit環境だと 9,223,372,036,854,775,807 まで扱えるのでマイクロ秒単位のデータだとすると 9,223,372,036,854 秒間のデータを扱えるので現実的になりますが、32bitか64bitかはOSとPHP自体のコンパイル条件に依存するため、言語仕様としてはどちらの環境でも扱えるよう文字列でデータを返し、かつ秒以上と秒未満を分割した形で出力しているのだと思われます。 その上で32bit環境なら浮動小数点演算を行って差を得るし、64bit環境なら整数値演算で得ればいいという事だと思います。 昨日例示したプログラムを <?php list($usec, $sec) = explode(" ", microtime()); $t1 = ($usec*1000000 + $sec*1000000); list($usec, $sec) = explode(" ", microtime()); $t2 = ($usec*1000000 + $sec*1000000); echo $t2 - $t1; ?> として64bit環境で動作させたら「31」と返ってきたので、かけ算、足し算等の間に31マイクロ秒掛かったということなんだと思います。
お礼
ありがとうございました。
補足
実行してみました。 (間にsleep(10)をはさんでます) list($usec, $sec) = explode(" ", microtime()); $t1 = ($usec*1000000 + $sec*1000000); sleep(10); list($usec, $sec) = explode(" ", microtime()); $t2 = ($usec*1000000 + $sec*1000000); echo $t2; echo "</br>"; echo $t1; echo "</br>"; echo $t2 - $t1; ?> 結果は以下のとおりでした。 1.3669576409963E+15 1.3669576309947E+15 10001606 t2が、1.3669576409963E+15 マクロ秒 t1が、1.3669576309947E+15 マイクロ秒 なのでt2-t1で、10001606 マイクロ秒 つまり、10.001606 秒と理解できる、ということかと思います。 ところで、 $usec*1000000は、マイクロ秒を秒に直しているのだと思いますが、 $sec*1000000は、元の単位が秒なのにどうして掛ける必要がでてくるのでしょうか? (確かに10000000を掛けないと、10秒からほど遠い値になりましたが) きっと、私は根本的に理解を誤っているようですね。
- agunuz
- ベストアンサー率65% (288/438)
>「マイクロ秒」を取得できる、というのはどういうことなのか、 microtime()の戻り値は(デフォルトでは)文字列です。なので例示ソースもexplodeしてからfloatにしていると思います。 http://php.net/manual/ja/function.microtime.php その最初の文字列がmicrosecで(secの小数以下で)返ってくるということです。表示させてみれば一目瞭然だと思いますが・・・ <?php print microtime() . "<br />"; print microtime() . "<br />"; sleep (1); print microtime() . "<br />"; print microtime() . "<br />";
お礼
ありがとうございました。
補足
結果は以下のとおりでした。 msec sec 0.90424400 1366878333 0.90424700 1366878333 0.90424500 1366878334 0.90425900 1366878334 「sec はUnix エポック (1970 年 1 月 1 日 0:00:00 GMT) から計算した秒数」なので、1行目なら1366878333秒ですね。 「msec は secから経過したマイクロ秒数」なので、1行目なら0.90424400マイクロ秒経過したことになるのですね。 そうすると、 0.90425900 1366878334(4行目)から 0.90424400 1366878333(1行目)を引くと、 0.000015マイクロ秒と1秒となります。 同じ時期に、microtime(true)で取得した時間です。 1366878335.9043 1366878334.9043 小数点以下が0.9043なので、microtime()で取得したmsecの値0.90424400 とほぼ同じです。 また、小数点以上は1366878335なのでmicrotime()で取得したsecの値1366878334より1秒大きくなっています。 つまり、microtime(true)から返る値1366878334.9043は、秒とマイクロ秒が混在しているということになり、いわゆる、「何点何々秒」ではなく、「何秒と何々マイクロ秒」と読む、ということになるのですが、そういう解釈で正しいのでしょうか?
- t_ohta
- ベストアンサー率38% (5238/13706)
下記のプログラムを実行すると差が出ますから、マイクロ秒で出力できているように思いますが。 <?php list($usec, $sec) = explode(" ", microtime()); $t1 = ((float)$usec + (float)$sec); list($usec, $sec) = explode(" ", microtime()); $t2 = ((float)$usec + (float)$sec); echo $t2 - $t1; ?>
お礼
ありがとうございました。
補足
間にsleepを10秒はさんだり、 microtime(ture)の結果とも比較できるように、 少しアレンジして実行してみました。 <?php list($usec, $sec) = explode(" ", microtime()); $t1 = ((float)$usec + (float)$sec); sleep(10); list($usec, $sec) = explode(" ", microtime()); $t2 = ((float)$usec + (float)$sec); echo $t2 - $t1; echo "</br>"; $t3=microtime(true); sleep(10); $t4=microtime(true); echo $t4-$t3; ?> 結果は以下のとおりです。 10.000201940536 10.000323057175 ブラウザの表示も10秒×2回分=20秒くらいでした。 やや誤差はあるものの、取得できたデータは「秒」と理解できると思いますが、そうすると、「マイクロ秒」を取得できる、というのはどういうことなのか、ということで質問させていただきました。
補足
どちらも、取得時点では「秒」で、同じ単位なんですね。 PHPの公式サイトの以下の記述からそれを読めないのは私だけでしょうか。 「microtime() は "msec sec" 形式の文字列を返します。ただし、sec は Unix エポック (1970 年 1 月 1 日 0:00:00 GMT) から計算した秒数、msec は secから経過したマイクロ秒数です。」 msecの単位が「マイクロ秒」だと思ったら間違いで、0.000001という形式でもって「マイクロ秒数」表現し、単位としては「秒」で理解するということなんですね。