【PHP8.x】hrtime関数の使い方
hrtime関数は、PHPでプログラムの実行時間を極めて高い精度で計測する機能を提供する関数です。一般的なtime()
関数が秒単位、microtime()
関数がマイクロ秒単位の時刻を扱うのに対し、このhrtime
関数はナノ秒(10億分の1秒)単位での時間計測を可能にします。
この関数は、引数の指定によって異なる値を提供します。引数を省略してhrtime()
と呼び出した場合、またはhrtime(false)
と呼び出した場合は、前回のhrtime()
またはhrtime(false)
の呼び出しからの経過時間をナノ秒単位で返します。これにより、特定の処理ブロックの実行時間を簡単に測定することができます。
一方、引数にtrue
を指定してhrtime(true)
と呼び出した場合は、現在の高精度な単調増加時間(monotonic time)をナノ秒単位で返します。単調増加時間とは、システムの時刻が変更されても逆行せず、常に前方へ進む時間を指すため、システム時刻の調整に影響されず、信頼性の高い時間計測が可能です。
主に、アプリケーションのパフォーマンスベンチマークや、処理のボトルネックを特定するための詳細な時間分析など、非常に短い処理時間を厳密に測定する必要がある場面で利用されます。この関数を使用することで、プログラムの効率改善に役立つ正確なデータを得ることができます。
基本的な使い方
構文(syntax)
<?php
$highResolutionTime = hrtime();
echo $highResolutionTime;
?>
引数(parameters)
?bool $as_number = null
- bool $as_number = null: 戻り値の型を数値(float)で取得するかどうかを指定します。
true
を指定すると浮動小数点数で、false
またはnull
を指定すると配列で取得します。
戻り値(return)
array|int|float
hrtime()
関数は、高精度の時間をナノ秒単位で返します。hrtime(true)
を指定すると、float型で返され、指定しない場合は、配列として返されます。
サンプルコード
PHP hrtime をミリ秒で計測する
<?php
/**
* 高精度タイマー(hrtime)を使用して処理時間を計測し、ミリ秒で出力します。
*
* この関数は、特定の処理の実行にかかった時間をナノ秒単位で計測し、
* それを人間が読みやすいミリ秒単位に変換して表示します。
*/
function demonstrateHrtimeToMilliseconds(): void
{
// 処理開始前の高精度タイムスタンプをナノ秒単位の数値として取得します。
// hrtime(true) は、システム起動時からの経過時間をナノ秒で返します。
$startTime = hrtime(true);
// ここに時間を計測したい処理を記述します。
// この例では、100ミリ秒 (100,000マイクロ秒) の待機処理をシミュレートします。
usleep(100000);
// 処理終了後の高精度タイムスタンプを取得します。
$endTime = hrtime(true);
// 終了時刻から開始時刻を引いて、経過時間をナノ秒で計算します。
$elapsedTimeNanoseconds = $endTime - $startTime;
// 経過時間(ナノ秒)をミリ秒に変換します。
// 1ミリ秒 = 1,000,000ナノ秒 です。
$elapsedTimeMilliseconds = $elapsedTimeNanoseconds / 1_000_000;
// 計測結果を小数点以下3桁まで表示します。
echo sprintf("経過時間: %.3f ミリ秒\n", $elapsedTimeMilliseconds);
}
// 関数を実行して結果を表示します。
demonstrateHrtimeToMilliseconds();
PHPのhrtime()
関数は、システムの任意の時点からの経過時間を高精度なナノ秒単位で取得します。主に、特定の処理にかかった時間を正確に計測する目的で使用されます。
この関数は、引数に true
を渡すと、戻り値として経過時間をナノ秒単位の数値(整数または浮動小数点数)で返します。引数を指定しない、または false
を渡した場合は、秒とナノ秒を要素に持つ配列が返されます。
サンプルコードは、この関数を使って処理時間をミリ秒で計測する例です。まず、処理開始前に hrtime(true)
を呼び出して開始時刻を数値として取得します。次に対象の処理を実行し、その直後に再び hrtime(true)
で終了時刻を取得します。そして、終了時刻から開始時刻を引くことで、処理に要した時間をナノ秒単位で算出します。最後に、この結果はナノ秒であるため、1,000,000で割ることで人間が理解しやすいミリ秒単位に変換し、画面に出力しています。
hrtime(true)
が返す値は、システム起動時からの経過時間をナノ秒単位の数値で表したものです。これは現在時刻ではないため、あくまで時間間隔の計測にのみ使用してください。ミリ秒に変換するには、サンプルコードのように1,000,000で割る必要があります。この単位の計算を間違えないことが重要です。また、引数にtrue
を指定しない場合の戻り値は配列となり、直接引き算ができないため注意が必要です。この関数はOSの時刻変更に影響されないため、microtime()
よりも信頼性の高い処理時間の計測が可能です。