Node.jsにおける高精度タイミング:ベストプラクティス
Wenhao Wang
Dev Intern · Leapcell

もしあなたがNode.jsコードの実行時間をテストする場合、どのタイミング関数を選択しますか?一般的に思い浮かぶ最初の選択肢はDate.now
またはDate.getTime
でしょう。
結論から先に:
Node.jsプログラムでは、process.hrtime
を優先し、次にperformance.now
、最後にDate.now
を使用してください。
この優先順位は、精度とクロック同期の考慮に基づいています。
説明
Date.now
の制限
- 返される時間の精度はミリ秒レベル(10^-3)であり、多くのユースケースには不十分です。
- システム時刻の影響を受け、他のソフトウェアからの調整によって影響を受ける可能性があります。
より高い精度とシステム時刻からの独立性を実現するために、W3CはHigh Resolution Time Level 2標準を確立しました。6. Monotonic Clockセクションでは、標準準拠の実装は「monotonic」なグローバルシステムクロックを提供する必要があると規定しています。
この標準は、performance
オブジェクトを通じてNode.jsとブラウザの両方で実装されています。performance.now
を使用して、開始点からの相対的なタイムスタンプを取得できます。これには次の機能があります。
- JavaScriptの他の時間関連関数(例:
Date.now
)とは異なり、performance.now()
は浮動小数点数を返し、マイクロ秒(10^-6)の精度を実現します。 - 時間は一定の速度で増加し、システム時刻の調整(例:他のソフトウェアによる変更)の影響を受けません。
- 標準定義に従い、
performance.now()
はクロックドリフトを許容します。
クロックドリフトに関する簡単な注意
クロックドリフトは、複数の独立したクロックを同期させることを目的とするクロック同期の概念から生じます。実際には、同期後であっても、クロックの刻み速度のわずかな違いにより、時間が経過するとクロックがドリフトし、表示される時間が異なる場合があります。
より正確なクロックはありますか?
はい、Node.jsにはprocess.hrtime
メソッドがあります。
- Node.js v0.7.6で導入され、優れた互換性があります(現在のバージョンはすでにv22 LTSです)。
- ナノ秒(10^-9)の精度を提供します。
- クロックドリフトの影響を受けません。
process.hrtime
メソッドは、時間間隔を測定するために特別に設計されています。
注意: ブラウザ環境はhrtime
をサポートしていないため、ブラウザで達成可能な最高の精度は、performance.now
を介したマイクロ秒レベルです(ブラウザ間の実装の違いに左右されます)。
ただし、process.hrtime
を使用するには、その使用法に注意が必要です。最初の呼び出しはtime
値を返し、これは後続の呼び出しの入力パラメータとして使用する必要があります。
const NS_PER_SEC = 1e9; const time = process.hrtime(); // 最初の呼び出し、最初の`time`変数を返します // [ 1800216, 25 ] setTimeout(() => { const diff = process.hrtime(time); // 2回目の呼び出しで、最初に返された`time`を入力として使用して、時間差を計算します // [ 1, 552 ] console.log(`Benchmark took ${diff[0] * NS_PER_SEC + diff[1]} nanoseconds`); // Benchmark took 1000000552 nanoseconds }, 1000);
これで主な内容は終わり、自然にこのセクションの冒頭の結論につながります。
追加の注意
hrtime.bigint
メソッドも使用できます。これはprocess.hrtime
のBigIntベースのバージョンであり(BigIntのサポートはv10.4で導入されました)、現在の高精度な実際の時間を提供します。
このメソッドは、追加のtime
入力パラメータを必要としないため、process.hrtime
よりも便利です。2回の呼び出しの結果を単純に減算することで、時間差を計算できます。
const start = process.hrtime.bigint(); // 191051479007711n setTimeout(() => { const end = process.hrtime.bigint(); // 191052633396993n console.log(`Benchmark took ${end - start} nanoseconds`); // Benchmark took 1154389282 nanoseconds }, 1000);
私たちはLeapcellです。Node.jsプロジェクトをクラウドにデプロイするための最適な選択肢です。
Leapcellは、Webホスティング、非同期タスク、およびRedis用の次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発します。
無制限のプロジェクトを無料でデプロイ
- 使用量に対してのみ料金を支払います — リクエストも料金もかかりません。
比類のない費用対効果
- アイドル料金なしの従量課金制。
- 例:25ドルで、平均応答時間60ミリ秒で694万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察のためのリアルタイムのメトリクスとロギング。
簡単なスケーラビリティと高いパフォーマンス
- 高い同時実行性を容易に処理するための自動スケーリング。
- 運用オーバーヘッドゼロ — 構築に集中できます。
詳細については、ドキュメントをご覧ください。
Xでフォローしてください:@LeapcellHQ