現在の位置: ホーム> 最新記事一覧> GetTimeのマイクロ秒の精度損失の問題を解決します

GetTimeのマイクロ秒の精度損失の問題を解決します

gitbox 2025-05-26

PHPでは、現在の時間のマイクロ秒部分を取得することは、通常、 getTimeOfday()関数を使用するために使用されます。この関数は、現在の時間の秒とマイクロ秒を返すことができ、精度は非常に高くなるはずです。ただし、実際に使用すると、多くの開発者は、マイクロ秒部分の精度が予想されていないことを発見しており、特に非常に高いパフォーマンスまたはタイムスタンプの要件を持つシナリオでは、損失または不正確さがあり、時間関連の計算が不正確になります。

この記事では、GetTime()精度が詳細に喪失した理由を分析し、PHPのマイクロ秒の不正確さの問題を解決するためのいくつかの効果的なソリューションを提供します。


1。GetTimeOfday関数とその精度の問題

GetTimeOfDay()は、 2つの重要なフィールドを含む配列を返します。

  • SEC :Unix Epochから数秒

  • USEC :現在の秒のマイクロ秒数

通常の状況では、 USECは100万分の1秒に正確である必要がありますが、一部のシステムまたはPHPバージョンでは、 USECは完全に信頼性がなく、精度が低い場合もゼロもあります。

 <?php
$time = gettimeofday();
echo "Seconds: " . $time['sec'] . "\n";
echo "Microseconds: " . $time['usec'] . "\n";
?>

テストでUSECが常にゼロであるか、変更が非常に少ないことがわかった場合、システムコールレベルの問題またはPHPバインディング機能自体の制限である可能性があります。


2。PHPでより高い精度で現在の時間を取得する方法

1.マイクロタイムを使用する(true)

MicroTime()は、PHPでより一般的に使用される機能であり、マイクロ秒タイムスタンプを取得します。 MicroTime(True)の呼び出しは、マイクロ秒で10進数秒のタイムスタンプを返します。

 <?php
$microtime = microtime(true);
echo "Current time with microseconds: " . $microtime . "\n";
?>

MicroTime(true)は、数秒以上の小数点後にマイクロ秒でフローティングポイント形式を返し、精度は通常より安定します。 GetTimeOfday()の代わりにこれを使用することをお勧めします。


2。HRTIME ()を使用して、ナノ秒レベル時間を達成します

PHP 7.3以降のバージョンはHRTIME()をサポートしています。これは、時間測定精度の非常に高い要件を持つシナリオに適したナノ秒時間を返す高精度タイマーです。

 <?php
// 現在の時間のナノ2番数を返します
$nanoseconds = hrtime(true);
echo "High resolution time in nanoseconds: " . $nanoseconds . "\n";

// ナノ2番を2番に変換します + マイクロ2番
$seconds = floor($nanoseconds / 1e9);
$microseconds = floor(($nanoseconds % 1e9) / 1e3);
echo "Seconds: $seconds, Microseconds: $microseconds\n";
?>

HRTIME()はシステム時間を表しませんが、パフォーマンステストやその他のニーズに適した高精度タイマーを表します。


3.マイクロ秒時間形式をカスタマイズします

出力を時間内にフォーマットし、マイクロ秒が正確である場合は、 DateTimeDateTimeImmutableを組み合わせて処理できます。

 <?php
$date = DateTime::createFromFormat('U.u', microtime(true));
echo $date->format("Y-m-d H:i:s.u") . "\n";
?>

これにより、正確な形式と読み取り可能なマイクロ秒を含む時間文字列が出力されます。


3。概要

  • GetTimeOfDay()は、一部の環境ではマイクロ秒の精度が不十分であり、高精度の時間測定に依存することはお勧めしません。

  • マイクロタイム(TRUE)を使用して、マイクロ秒のタイムスタンプを取得します。これは、シンプルで便利で、適切な互換性があります。

  • より高い精度タイミングが必要な場合は、ナノ秒レベルのタイミングをサポートするPHP 7.3+ HRTIME()を使用することをお勧めします。

  • MicroTime(True)と組み合わせたDateTimeオブジェクトは、マイクロ秒で出力フォーマットされた時間を簡単に達成できます。

これらの方法は、PHPにおけるマイクロ秒の不正確さの問題を解決し、アプリケーションの時間精度のニーズが満たされることを確認するために組み合わせて使用​​できます。


 <?php
// 例:使用 microtime(true) 現在の時間を取得し、出力をフォーマットします
$microtime = microtime(true);
$date = DateTime::createFromFormat('U.u', $microtime);
echo "当前时间带マイクロ2番:" . $date->format("Y-m-d H:i:s.u") . "\n";

// 使用 hrtime() 高精度時間を取得します
$nanoseconds = hrtime(true);
$seconds = floor($nanoseconds / 1e9);
$microseconds = floor(($nanoseconds % 1e9) / 1e3);
echo "高精度タイマー - 2番: $seconds, マイクロ2番: $microseconds\n";

// 参照ドキュメントアドレス:https://gitbox.net/php/manual/en/function.microtime.php
?>