web-dev-qa-db-ja.com

Node.jsでマイクロタイムを取得する方法は?

Node.jsで最も正確なタイムスタンプを取得するにはどうすればよいですか?

ps Node.jsの私のバージョンは0.8.Xであり、 node-microtime extension が機能しません(インストール時にクラッシュします)

83
NiLL

new Date().getTime()?これにより、ミリ秒単位のタイムスタンプが提供されます。これは、JSが提供する最も正確なものです。

更新:vaughanが述べたように、process.hrtime()はNode.js内で利用可能です-その解像度はナノ秒であるため、はるかに高く、これはより正確である必要があるという意味ではありません。

PS .:わかりやすくするために、process.hrtime()は、現在の高解像度リアルタイムを含むタプルArrayを返します[秒、ナノ秒]

86

Node.jsでは、「高解像度時間」が process.hrtime を介して利用可能になります。最初の要素が秒単位の時間で、2番目の要素が残りのナノ秒の配列を返します。

現在の時間をマイクロ秒で取得するには、次の手順を実行します。

var hrTime = process.hrtime()
console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)

(上記の変換でエラーを指摘してくれた itaifrenkel に感謝します。)

最新のブラウザでは、マイクロ秒精度の時間はperformance.nowとして利用できます。ドキュメントについては https://developer.mozilla.org/en-US/docs/Web/API/Performance/now をご覧ください。

process.hrtimeに基づいてNode.jsにこの関数を実装しましたが、プログラム内の2つのポイント間の時間差を計算するだけでは比較的使いにくいです。 http://npmjs.org/package/performance-now を参照してください。仕様によると、この関数は時間をミリ秒単位で報告しますが、サブミリ秒の精度の浮動小数点数です。

このモジュールのバージョン2.0では、報告されたミリ秒は、ノードプロセスが開始された時間に相対的です(Date.now() - (process.uptime() * 1000))。 Date.now()に似たタイムスタンプが必要な場合は、結果にそれを追加する必要があります。また、Date.now() - (process.uptime() * 1000)を再計算してください。 Date.nowprocess.uptimeは両方とも、正確な測定には非常に信頼できません。

現在の時刻をマイクロ秒単位で取得するには、次のようなものを使用できます。

var loadTimeInMS = Date.now()
var performanceNow = require("performance-now")
console.log((loadTimeInMS + performanceNow()) * 1000)

参照: JavaScriptは高解像度タイマーを提供しますか?

162
Myrne Stol
now('milli'); //  120335360.999686
now('micro') ; // 120335360966.583
now('nano') ; //  120335360904333

nowは次のとおりです。

const now = (unit) => {

  const hrTime = process.hrtime();

  switch (unit) {

    case 'milli':
      return hrTime[0] * 1000 + hrTime[1] / 1000000;

    case 'micro':
      return hrTime[0] * 1000000 + hrTime[1] / 1000;

    case 'nano':
      return hrTime[0] * 1000000000 + hrTime[1];

    default:
      return now('nano');
  }

};
15
Abdennour TOUMI

https://github.com/wadey/node-microtime もあります:

> var microtime = require('microtime')
> microtime.now()
1297448895297028
6
mikemaccana

Node.js nanotimer

process.hrtime関数呼び出しの上にnode.jsのラッパーライブラリ/オブジェクトを作成しました。秒、ミリ秒、マイクロ、さらにはナノ単位で指定される同期および非同期タスクのタイミングなどの便利な機能があり、組み込みのjavascriptタイマーの構文に馴染むようになっています。

タイマーオブジェクトも独立しているため、必要な数だけ、それぞれ独自のsetTimeoutまたはsetIntervalプロセスを実行できます。

nanotimer と呼ばれます。見てみな!

5
krb686

Node.js 10.7.0以降、 BigInt データ型がサポートされています。 (ブログ投稿アナウンスメント)も参照してください。これらのサポートされているNode.jsのバージョンでは、 process.hrtime([time]) メソッドは「レガシー」と見なされ、 process.hrtime.bigint() メソッドに置き換えられました。

現在の高解像度リアルタイムをbigintで返すprocess.hrtime()メソッドのbigintバージョン。

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);

tl; dr

  • Node.js 10.7.0+-process.hrtime.bigint()を使用
  • それ以外の場合-process.hrtime()を使用
4
d4nyll

Date.now()よりも高い精度で動作しますが、浮動小数点の精度はミリ秒です。

function getTimeMSFloat() {
    var hrtime = process.hrtime();
    return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}
2
Ross

linuxではマイクロ秒の精度のタイムスタンプを返すシステムgettimeofday()関数にバインドするnpmパッケージがあります。 npm gettimeofdayを検索します。 Cの呼び出しはprocess.hrtime()よりも高速です

0
Andras

hrtimeを1行で単一の数値として取得します。

const begin = process.hrtime();
// ... Do the thing you want to measure
const nanoSeconds = process.hrtime(begin).reduce((sec, nano) => sec * 1e9 + nano)

Array.reduceは、単一の引数が与えられると、配列の最初の要素をaccumulatorの初期値として使用します。 0を初期値として使用することもできますが、これも機能しますが、なぜ* 0を追加するのでしょうか。

0

すぐに理解できるように書き直す:

const hrtime = process.hrtime();     // [0] is seconds, [1] is nanoseconds

let nanoSeconds = (hrtime[0] * 1e9) + hrtime[1];    // 1 second is 1e9 nano seconds
console.log('nanoSeconds:  ' + nanoSeconds);
//nanoSeconds:  97760957504895

let microSeconds = parseInt(((hrtime[0] * 1e6) + (hrtime[1]) * 1e-3));
console.log('microSeconds: ' + microSeconds);
//microSeconds: 97760957504

let milliSeconds = parseInt(((hrtime[0] * 1e3) + (hrtime[1]) * 1e-6));
console.log('milliSeconds: ' + milliSeconds);
//milliSeconds: 97760957

ソース: https://nodejs.org/api/process.html#process_process_hrtime_time