Node.js でミリ秒より高解像度の時刻情報取得や計測を行う方法
はじめに
Node.js でミリ秒よりも高精度のタイマーやタイムスタンプを利用する方法について整理した。
TL;DR
- マイクロ秒オーダーでの Unix Timestamp を使いたい場合は
microtime
(node-microtime
) を使う - Performance Timing API の
performance.now()
とperfomance.timeOrigin
を組み合わせてもマイクロ秒オーダーで Unix Timestamp が取得できる process.hrtime()
でナノ秒オーダで計測が可能
目次
環境・条件
1 | $ sw_vers |
詳細
new Date().getTime()
がミリ秒精度の情報しか取れないので、それ以上の解像度のある時刻の取得処理や区間時間の計測処理などについて調べた。
microtime (node-microtime)
microtime.now()
で、現在時刻の Unix Timestamp をマイクロ秒オーダーで取得。
1 | const microtime = require("microtime"); |
microtime.nowDouble()
を使うと、整数部に秒、小数部にミリ秒以下の形式で取得できる。
1 | const microtime = require("microtime"); |
Performance Timing API
区間の処理時間を計測するなどであれば、Node.js に組み込まれている Performance Timing API を使うのが良いっぽい。
Returns the current high resolution millisecond timestamp, where 0 represents the start of the current node process.
performance.now()
で、整数部がミリ秒、小数部がマイクロ秒以下の値を取得できる。値はプロセス起動時を 0
としたものなので、Unix Timestamp のように絶対時刻ではないことに注意。
1 | const { performance } = require('perf_hooks'); |
The timeOrigin specifies the high resolution millisecond timestamp at which the current node process began, measured in Unix time.
performance.timeOrigin
で、プロセス起動時の Unix Timestamp を取得できるので、performance.now()
と合わせれば高解像度の Unix Timestamp が取得できる模様。
1 | const { performance } = require('perf_hooks'); |
その他、performance.mark
と performance.measure
で、指定区間の処理時間を簡単に計測できるっぽい。
process.hrtime
process.hrtime()
でも、高解像度の情報を取得できる。戻り地は [秒, ナノ秒]
の配列。
1 | console.log(process.hrtime()); |
new Date().getTime()
と同時に実行してみたが、実際の時刻とは関係ないっぽい。
1 | console.log({ |
These times are relative to an arbitrary time in the past, and not related to the time of day and therefore not subject to clock drift. The primary use is for measuring performance between intervals:
とあるので、主に特定区間の処理時間計測などに使う模様。
関連パッケージ
試してないけど process.hrtime
と関係あるパッケージがいくつかあるっぽい。
まとめ
- マイクロ秒オーダーでの Unix Timestamp を使いたい場合は
microtime
(node-microtime
) を使う - Performance Timing API の
performance.now()
とperfomance.timeOrigin
を組み合わせてもマイクロ秒オーダーで Unix Timestamp が取得できる process.hrtime()
でナノ秒オーダで計測が可能
その他・メモ
nano-date - npm とか言うのもあるけど軽くためした感じでは、別にナノ秒精度で情報が取得できるものじゃないっぽかった。
参考文献
- javascript - How to get a microtime in Node.js? - Stack Overflow
- microtime - npm
- Performance Timing API | Node.js v12.12.0 Documentation
- pretty-time - npm
- nanoseconds - npm
- convert-hrtime - npm
- nano-date - npm
関連記事
- axios で添付ファイルありのリクエスト(multipart/form-data の POST)
- axios で unable to verify the first certificate の対応方法
- Git で package-lock.json がコンフリクトした時の解決方法
- Vue.js で FontAwesome を使う方法
- Node.js で firebase-admin を使ってサーバからプッシュ通知
- ブラウザで Node.js の Buffer を使う(CDN)
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア