2

そこで、ファイルを作成し、実行中の専用サーバーmicrotime.phpでテストしました。Windows Server 2008 R2 64x Enterprisesnginx

<?php 
for ( $i = 0; $i <= 5; $i++ ) {
 echo time() . '<br />';
 echo microtime() . '<br />';
 echo '<br />';
}
?>

そして私はこれを得る:

1371343916
0.52320400 1371343916

1371343916
0.52320400 1371343916

1371343916
0.52320400 1371343916

1371343916
0.52320400 1371343916

1371343916
0.52320400 1371343916

1371343916
0.52320400 1371343916

結果が同じである理由とそれを修正する方法は?

代わりに、次のようなものを取得する必要があります。

1371345446
0.61877300 1371345446

1371345446
0.61878200 1371345446

1371345446
0.61878500 1371345446

1371345446
0.61878700 1371345446

1371345446
0.61878900 1371345446

1371345446
0.61879100 1371345446

敬具。

4

3 に答える 3

1

簡単な答え: マイクロタイムの値の繰り返しは、マイクロタイムが更新される頻度と関係があります。更新ごとに何度も値を要求しています。関連する質問は以前に尋ねられました。最新の PC の内部クロックはどれくらい正確ですか? なぜそうなのかを理解するのに役立ちました。また、「HPET」および「precision timers」で検索してください。

精度の向上: マイクロ時間をマイクロ秒と秒に分解し、それぞれに 10^8 を掛けて (たとえば)、再度足し合わせると、より正確になります。それを文字列に変換してエコーすると、「小数点以下の秒数」の右側にさらに数値が表示されます。余談ですが、私はこれを 8 秒単位で正しいと呼んでいます。興味深いことに、それを表す英語の単語がないからです。

ポイントを証明するコードを次に示します。

    echo 'MICROTIME: '.microtime()." ";
    list($microseconds,$seconds) = explode(' ',microtime());
    $precisedatetimestamp = number_format((($seconds * 100000000)  + ($microseconds * 100000000)),"0","","");
    settype($precisedatetimestamp,'string');
    echo ' ..RETURNED : '.number_format($precisedatetimestamp,0,"","").'<br />';

それを数千回ループして、結果を確認します。そのレベルの精度でも、繰り返しを防ぐことはできません。つまり、重複が少なくなるだけです。プロセッサは高速で (さらに高速になりつつあり)、1 秒間に非常に多くの命令を実行できます。それは、目的に必要な精度のレベルの問題です。それは、内部クロックの更新頻度と同程度にしか正確ではありません。

于 2015-03-10T10:11:22.837 に答える
0

Mac OSX Lion でコードを実行すると、次のようになります。

1371583001
0.01606600 1371583001

1371583001
0.01609400 1371583001

1371583001
0.01610400 1371583001

1371583001
0.01611200 1371583001

1371583001
0.01612100 1371583001

1371583001
0.01612900 1371583001

そのため、Windows で結果を変更するには、さらに反復を実行する必要があるようです。

于 2013-06-18T19:22:01.507 に答える
0

記録のために、7.2 + windows (ただし、同じ結果で他のマシンでもテストしました)。

<?php
for ( $i = 0; $i <= 1000; $i++ ) {
    $k1=microtime();
    usleep(1);
    $k2=microtime();
    if($k1==$k2) echo "error k1 and k2<br>";
}
?>

複製はありません。

どうやら、usleep はシステムから正しい時刻を強制的にリロードするように強制します。

編集: time_nanosleep(0,1); も機能します(ナノ秒スリープします)。

于 2018-12-29T19:36:15.977 に答える