• ベストアンサー

PHPのmicrotime()について

お世話になっております。 microtime()関数で、現在のタイムスタンプをマイクロ秒単位で取得できるので、 処理前後で、これの差を求めると、 処理時間が出るかと思います。 元の値の単位がマイクロ秒なので、 差をとってもマイクロ秒だと思うのですが、 出た結果は、体感として秒単位のようにも見えます。 実際、計算結果は秒単位であると解説しているサイトなんかもありますが、 本当に秒という認識で大丈夫でしょうか? 理由とともに教えていただければ幸いです。

  • PHP
  • 回答数5
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5083/13282)
回答No.4

> $usec*1000000は、マイクロ秒を秒に直しているのだと思いますが、 こちらは取り出した時点の単位が「秒」のため 1 マイクロ秒が 0.000001 秒として取り出されますので、掛け算をして 0.000001 秒というデータを 1 マイクロ秒というデータにしています。 > $sec*1000000は、元の単位が秒なのにどうして掛ける必要がでてくるのでしょうか? こちらも取り出した時点での単位は「秒」ですので、マイクロ秒に変換しなければいけません。 1 秒は 1000000 マイクロ秒 ですから掛け算をおこなっています。

freeradical
質問者

補足

どちらも、取得時点では「秒」で、同じ単位なんですね。 PHPの公式サイトの以下の記述からそれを読めないのは私だけでしょうか。 「microtime() は "msec sec" 形式の文字列を返します。ただし、sec は Unix エポック (1970 年 1 月 1 日 0:00:00 GMT) から計算した秒数、msec は secから経過したマイクロ秒数です。」 msecの単位が「マイクロ秒」だと思ったら間違いで、0.000001という形式でもって「マイクロ秒数」表現し、単位としては「秒」で理解するということなんですね。

その他の回答 (4)

  • t_ohta
  • ベストアンサー率38% (5083/13282)
回答No.5

> PHPの公式サイトの以下の記述からそれを読めないのは私だけでしょうか。 このあたりは戻り値の現物を見て理解していくしか無いと思います。 ン十万円も払って使うような開発言語なら開発元に文句の一つも言いますが、無償提供されているモノの場合は作っている人も、資料を翻訳している人も半ばボランティアだったりもします。 また、資料を作った人のスキル次第で表現が微妙だったりもしますしね。 PHPの場合は使用例などが公式サイトに豊富に出ているのでその内容から理解していけますが、使用例などが無ければ言語自体のソースを調べたり、たくさん実験して実装内容を推測するしか無い場合もあります。

freeradical
質問者

お礼

お忙しいところ、何度もご返信くださり、ありがとうございました。

  • t_ohta
  • ベストアンサー率38% (5083/13282)
回答No.3

> 取得できたデータは「秒」と理解できると思いますが これはデータの中身の「単位」を言われているのであれば数値の単位は秒で、少数を含めた全データはマイクロ秒をベースにした値が取れるという事になります。 マイクロ秒単位の整数でデータを扱おうとすると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マイクロ秒掛かったということなんだと思います。

freeradical
質問者

お礼

ありがとうございました。

freeradical
質問者

補足

実行してみました。 (間に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)
回答No.2

>「マイクロ秒」を取得できる、というのはどういうことなのか、 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 />";

freeradical
質問者

お礼

ありがとうございました。

freeradical
質問者

補足

結果は以下のとおりでした。 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% (5083/13282)
回答No.1

下記のプログラムを実行すると差が出ますから、マイクロ秒で出力できているように思いますが。 <?php list($usec, $sec) = explode(" ", microtime()); $t1 = ((float)$usec + (float)$sec); list($usec, $sec) = explode(" ", microtime()); $t2 = ((float)$usec + (float)$sec); echo $t2 - $t1; ?>

freeradical
質問者

お礼

ありがとうございました。

freeradical
質問者

補足

間に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秒くらいでした。 やや誤差はあるものの、取得できたデータは「秒」と理解できると思いますが、そうすると、「マイクロ秒」を取得できる、というのはどういうことなのか、ということで質問させていただきました。

関連するQ&A

  • microtime関数は、結構イイカゲン?!

    いつもお世話になっております。 環境/PHP5 <?php //開始時刻を記録 $start_time = microtime(); //ユーザ定義関数 user_function($arg); //終了時刻を記録 $end_time = microtime(); //時刻差を求め、ユーザ定義関数の処理にかかった時間を求めたい $dif_time = $end_time - $start_time; //求めた数値を出力 echo $dif_time; //関数の定義 function user_function($arg){ ~処理定義~ } ?> 上記スクリプトの出力結果が、 マイナスの値だったり、プラスの値だったりするのですが、 それはなぜなのでしょう? -0.238105 だったり、 0.708105 だったりします。 プラスの値で、数字が上下するならまだしも、 値がマイナスになる意味がわかりません。笑 軽くバックトゥザフューチャーしちゃってるのでしょうか。 ともかく、すごく、あてにならない感じなのです。 microtime関数は、結構イイカゲンな仕様なのでしょうか?

    • ベストアンサー
    • PHP
  • EXCELで、時間のシリアル値を、表示どおりの数値に変換したいのですが。

    はじめまして。 EXCELを使用して、単位時間(秒)あたりの処理件数を算出したいのですが、うまくいきません。 具体的には、 時間:2s256ms 件数:10件 とした場合、 EXCELの表示上は、2.256と表示できます。(値は、シリアル値) これを、単純に10÷2.256とすると、シリアル値で割られて、結果が異なってしまいます。 時間を、T関数やTIME関数などを試してみましたが、うまくいきません。 また、時間は、自動計算で算出していますので、改めて入力をしたくありません。どうしたら、この表示時間で計算できるのか、教えていただけませんか。 よろしくお願いいたします。

  • 二つのファイルが同一タイムスタンプで書かれたときにエラー発生

    現在稼働中のシステムが、突然ダウンしました。 原因を調査しているのですが、特別変わったことがありません。 ただ、一つ気がついたのですが……このエラーは二つのファイルを書き込んだ直後に発生したのですが、その2つのファイルのタイムスタンプが、ミリ秒単位で全く同じなのです。(同じプロセスの別スレッドで書いています) それで質問なのですが 1. このように、全く同じタイミングでファイルが書かれるとエラーになる、というような症状を見聞きされた方はいらっしゃらないでしょうか。 2. タイムスタンプというのはどのタイミングで発行されるのでしょうか。(ファイルをクローズした瞬間、など) 3. 再現テストをしたいのですが、このように、ミリ秒単位でタイムスタンプを揃えて二つのファイルを書くような方法が何かあるでしょうか。 OSはWindows2000SP4です。 よろしくお願い致します。<(_ _)>

  • タイムスタンプを時間に変換

    getTime()メソッドが返した値の、右の3つの数字を消すとタイムスタンプが得られました。1970年からの経過秒らしいです。 このタイムスタンプから yyyy/mm/dd hh:mm:ss のような年月日の表示にしたいのですが、簡単にできる方法はありませんか? i=1189382252 str="" //タイムスタンプを時間に変換 alert(str)

  • time()関数

    Unix系でtime()関数を使うと現在時刻が1秒単位で取得出来ますが、ミリ秒単位で取得する方法ってありませんか?

  • PHPから他のPHPにPOSTして結果を得る方法

    a.phpから他サーバーにあるb.phpに入力されたデータをPOSTで送り、b.phpの「登録が完了しました」といった出力結果を、a.phpで処理したいと考えています。 PHPからPOST送信し、その結果を取得するにはどういった関数やコードがあるかを知りたいです。 よかったら回答をお願いします。

    • ベストアンサー
    • PHP
  • ペンタブレットの読取速度について

    初めましてよろしくお願いします。 さっそくですが,ペンタブレットの説明を読むと読取速度というものがあります。 値段の高いものほど値が大きいのですが,その差は体感できるようなものでしょうか? 例えばワコムのFAVOなら100ポイント/秒,intuos2は200ポイント/秒となっています。

  • mktimeについて教えてください

    今、日付の差を出すプログラムを作っているのですが mktime()関数では 1970年~2038年までしか 対応していないことがわかりました mktime()以外で 日付を Unix のタイムスタンプとして取得する 関数ってありますか?

    • ベストアンサー
    • PHP
  • PHPが処理を途中でやめる。原因を知りたい。

    PHPが処理を途中でやめるのですが、原因が分からないので教えてください。 Chromeで実行すると15秒ほど実行した後に101エラーが出ます。 なお、max_execution_timeは1800に設定してあります。 ブラウザを変えてやってみましたが、結果は同じような感じでした。 IEでは、「Internet Explorer ではこのページは表示できません」と出て、 Operaでは「接続はリモートサーバーから切断されました」と出ます。 コマンドプロンプトから実行しても同じように15秒ほど処理した後に、「CLIは動作を停止しました」と出ます。 いずれも、まったく処理していないわけではなく、停止するまでの15秒ほどは処理を進めてくれているようです。 原因分かりますでしょうか? XAMPP: 1.7.7 PHP: 5.3.8 Windows7(64bit) localhost上で実行しています。

    • ベストアンサー
    • PHP
  • accessのVBAのについて質問です。

    ACCESSでMO内に存在するファイルをチェックし存在するファイル名情報と、タイムスタンプの取得は可能でしょうか? データの存在する場合のみ処理を行いたくて、その結果によって処理の分岐を行いたいと思っています。 ※ACCESS97を主に使用していますが、ACCESS2000のみにしかその機能がない場合は、ACCESS2000を検討します。

専門家に質問してみよう