【PHP8.x】hrtime関数の使い方

hrtime関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

hrtime関数は、PHPでプログラムの実行時間を極めて高い精度で計測する機能を提供する関数です。一般的なtime()関数が秒単位、microtime()関数がマイクロ秒単位の時刻を扱うのに対し、このhrtime関数はナノ秒(10億分の1秒)単位での時間計測を可能にします。

この関数は、引数の指定によって異なる値を提供します。引数を省略してhrtime()と呼び出した場合、またはhrtime(false)と呼び出した場合は、前回のhrtime()またはhrtime(false)の呼び出しからの経過時間をナノ秒単位で返します。これにより、特定の処理ブロックの実行時間を簡単に測定することができます。

一方、引数にtrueを指定してhrtime(true)と呼び出した場合は、現在の高精度な単調増加時間(monotonic time)をナノ秒単位で返します。単調増加時間とは、システムの時刻が変更されても逆行せず、常に前方へ進む時間を指すため、システム時刻の調整に影響されず、信頼性の高い時間計測が可能です。

主に、アプリケーションのパフォーマンスベンチマークや、処理のボトルネックを特定するための詳細な時間分析など、非常に短い処理時間を厳密に測定する必要がある場面で利用されます。この関数を使用することで、プログラムの効率改善に役立つ正確なデータを得ることができます。

構文(syntax)

1<?php
2
3$highResolutionTime = hrtime();
4echo $highResolutionTime;
5
6?>

引数(parameters)

?bool $as_number = null

  • bool $as_number = null: 戻り値の型を数値(float)で取得するかどうかを指定します。true を指定すると浮動小数点数で、false または null を指定すると配列で取得します。

戻り値(return)

array|int|float

hrtime() 関数は、高精度の時間をナノ秒単位で返します。hrtime(true) を指定すると、float型で返され、指定しない場合は、配列として返されます。

サンプルコード

PHP hrtime をミリ秒で計測する

1<?php
2
3/**
4 * 高精度タイマー(hrtime)を使用して処理時間を計測し、ミリ秒で出力します。
5 *
6 * この関数は、特定の処理の実行にかかった時間をナノ秒単位で計測し、
7 * それを人間が読みやすいミリ秒単位に変換して表示します。
8 */
9function demonstrateHrtimeToMilliseconds(): void
10{
11    // 処理開始前の高精度タイムスタンプをナノ秒単位の数値として取得します。
12    // hrtime(true) は、システム起動時からの経過時間をナノ秒で返します。
13    $startTime = hrtime(true);
14
15    // ここに時間を計測したい処理を記述します。
16    // この例では、100ミリ秒 (100,000マイクロ秒) の待機処理をシミュレートします。
17    usleep(100000);
18
19    // 処理終了後の高精度タイムスタンプを取得します。
20    $endTime = hrtime(true);
21
22    // 終了時刻から開始時刻を引いて、経過時間をナノ秒で計算します。
23    $elapsedTimeNanoseconds = $endTime - $startTime;
24
25    // 経過時間(ナノ秒)をミリ秒に変換します。
26    // 1ミリ秒 = 1,000,000ナノ秒 です。
27    $elapsedTimeMilliseconds = $elapsedTimeNanoseconds / 1_000_000;
28
29    // 計測結果を小数点以下3桁まで表示します。
30    echo sprintf("経過時間: %.3f ミリ秒\n", $elapsedTimeMilliseconds);
31}
32
33// 関数を実行して結果を表示します。
34demonstrateHrtimeToMilliseconds();

PHPのhrtime()関数は、システムの任意の時点からの経過時間を高精度なナノ秒単位で取得します。主に、特定の処理にかかった時間を正確に計測する目的で使用されます。

この関数は、引数に true を渡すと、戻り値として経過時間をナノ秒単位の数値(整数または浮動小数点数)で返します。引数を指定しない、または false を渡した場合は、秒とナノ秒を要素に持つ配列が返されます。

サンプルコードは、この関数を使って処理時間をミリ秒で計測する例です。まず、処理開始前に hrtime(true) を呼び出して開始時刻を数値として取得します。次に対象の処理を実行し、その直後に再び hrtime(true) で終了時刻を取得します。そして、終了時刻から開始時刻を引くことで、処理に要した時間をナノ秒単位で算出します。最後に、この結果はナノ秒であるため、1,000,000で割ることで人間が理解しやすいミリ秒単位に変換し、画面に出力しています。

hrtime(true)が返す値は、システム起動時からの経過時間をナノ秒単位の数値で表したものです。これは現在時刻ではないため、あくまで時間間隔の計測にのみ使用してください。ミリ秒に変換するには、サンプルコードのように1,000,000で割る必要があります。この単位の計算を間違えないことが重要です。また、引数にtrueを指定しない場合の戻り値は配列となり、直接引き算ができないため注意が必要です。この関数はOSの時刻変更に影響されないため、microtime()よりも信頼性の高い処理時間の計測が可能です。

PHP hrtimeを秒に変換する

1<?php
2
3/**
4 * hrtime() で取得したナノ秒単位の時間を秒に変換する関数。
5 *
6 * @return float 現在時刻を秒単位で返します。
7 */
8function hrtime_to_seconds(): float
9{
10    // hrtime() を使用して現在の高分解能時間を取得します。
11    $hrtime = hrtime();
12
13    // ナノ秒を秒に変換します。
14    $seconds = $hrtime / 1_000_000_000;
15
16    return $seconds;
17}
18
19// 関数の実行例
20$current_time_seconds = hrtime_to_seconds();
21echo "現在の時刻 (秒): " . $current_time_seconds . PHP_EOL;
22?>

PHPのhrtime()関数は、システムの高分解能な時間を提供します。PHP8では、引数$as_numbernullを渡す(または省略する)と、デフォルトで配列が返されます。この配列は、秒とナノ秒の要素を含んでいます。hrtime(true)のようにtrueを渡すと、経過時間をナノ秒単位の整数で返します。

このサンプルコードでは、hrtime()関数を使用して取得したナノ秒単位の時間を、秒単位に変換するhrtime_to_seconds()関数を定義しています。まず、hrtime()関数を引数なしで呼び出し、現在の高分解能時間を取得します。次に、取得したナノ秒単位の時間を10億で割ることで、秒単位に変換しています。最後に、計算された秒単位の時間をfloat型で返します。

この例では、hrtime()関数の戻り値(ナノ秒単位の整数)を直接計算に利用しています。hrtime()はシステムの起動からの経過時間をナノ秒で表すため、この値を適切に処理することで、より正確な時間計測やパフォーマンス測定が可能になります。hrtime_to_seconds()関数を使用することで、hrtime()から得られた高精度な時間を、より扱いやすい秒単位に変換し、さまざまなアプリケーションで活用できます。

hrtime()関数は高精度な時間計測に使えますが、PHPのバージョンや環境によって挙動が異なる場合があります。引数$as_numberを省略した場合、PHP 7.3以前では整数型の配列が返っていましたが、現在はプラットフォーム依存で整数または浮動小数点数が返ります。明示的に数値を指定したい場合はhrtime(true)のようにtrueを渡してください。サンプルコードではナノ秒を秒に変換していますが、計算結果は浮動小数点数になるため、精度が重要な場合は注意が必要です。また、hrtime()はシステムの時間に依存するため、システムクロックが変更されると計測結果がおかしくなる可能性があります。

hrtime()とmicrotime()で時間計測する

1<?php
2
3/**
4 * hrtime() と microtime() の比較サンプル.
5 *
6 * hrtime() はより高精度な時間計測が可能。
7 * 特に、短い処理時間の計測や、システム全体のパフォーマンス分析に役立つ。
8 * microtime() は秒単位の浮動小数点数を返すため、より手軽に利用できる。
9 */
10function compareTimeFunctions(): void
11{
12    // hrtime() で開始時間を取得 (デフォルトは配列)
13    $start_hr = hrtime();
14
15    // microtime() で開始時間を取得
16    $start_micro = microtime(true); // float として取得
17
18    // 何らかの処理 (例: 100万回のループ)
19    for ($i = 0; $i < 1000000; $i++) {
20        // 空のループ
21    }
22
23    // hrtime() で終了時間を取得
24    $end_hr = hrtime();
25
26    // microtime() で終了時間を取得
27    $end_micro = microtime(true);
28
29    // hrtime() の経過時間を計算 (ナノ秒単位)
30    $elapsed_hr = ($end_hr[0] - $start_hr[0]) * 1000000000 + ($end_hr[1] - $start_hr[1]);
31
32    // microtime() の経過時間を計算 (秒単位)
33    $elapsed_micro = $end_micro - $start_micro;
34
35    echo "hrtime() 経過時間: " . $elapsed_hr . " ナノ秒\n";
36    echo "microtime() 経過時間: " . $elapsed_micro . " 秒\n";
37
38    // hrtime() を数値として取得する場合
39    $start_hr_num = hrtime(true);
40    usleep(100); // 100マイクロ秒スリープ
41    $end_hr_num = hrtime(true);
42    $elapsed_hr_num = $end_hr_num - $start_hr_num;
43
44    echo "hrtime(true) 経過時間: " . $elapsed_hr_num . " ナノ秒\n";
45}
46
47compareTimeFunctions();

hrtime()関数は、PHP8で利用できる高精度な時間計測関数です。引数にtrueまたはfalse(もしくはnull)を渡すことで、戻り値の形式を制御できます。引数を省略した場合(nullを渡した場合も同様)、hrtime()は配列を返します。この配列は、[秒, ナノ秒]という形式で、より正確な時間情報を提供します。trueを渡すと、起動時からの経過時間をナノ秒単位の整数で返します。

このサンプルコードでは、hrtime()microtime()を使って処理時間を計測し、その精度を比較しています。hrtime()はナノ秒単位で時間を計測できるため、より細かい時間計測が可能です。一方、microtime()は秒単位で時間を計測します。

サンプルでは、まずhrtime()microtime()で開始時間を記録し、次に100万回の空ループを実行します。その後、それぞれの関数で終了時間を記録し、経過時間を計算して表示します。hrtime()の経過時間はナノ秒単位で、microtime()の経過時間は秒単位で表示されます。

さらに、hrtime(true)を使用した場合の計測例も示しています。この場合、hrtime()はナノ秒単位の整数値を返すため、より簡潔に経過時間を計算できます。短いスリープ処理を挟むことで、hrtime(true)がマイクロ秒レベルの時間計測にも対応できることを確認できます。hrtime()は高精度な時間計測が必要な場合に有効な関数です。

hrtime()関数とmicrotime()関数の比較サンプルに関する注意点です。hrtime()は高精度な時間計測が可能ですが、戻り値が配列の場合、秒とナノ秒に分かれているため、経過時間を計算する際に両方の要素を考慮する必要があります。hrtime(true)とすると、開始からのナノ秒数が整数で返されるため、より扱いやすくなります。microtime(true)は、より手軽に秒単位の浮動小数点数で時間を得られます。hrtime()microtime()は、計測対象の処理時間や必要な精度によって使い分けるのがおすすめです。また、usleep()のような関数を使用する際は、単位(この場合はマイクロ秒)を間違えないように注意してください。

関連コンテンツ