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


回答:


102

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

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

PS .:明確にprocess.hrtime()するためにArray、現在の高解像度のリアルタイムを含むタプルを[秒、ナノ秒] で返します。


91
Date.now()お願いします。
jAndy

48
使用process.hrtime()
ヴォーン2013

2
同意する必要があります。この答えは完全に間違っています。正しい答えについては、@ Meryn Stolによる以下の回答を参照してください。
Justin Warkentin、2014

11
process.hrtime()これらの時間は過去の任意の時間を基準にしており、時刻とは関係がないため、クロックドリフトの影響を受けません。主な用途は、インターバル間のパフォーマンスを測定することです。したがって、現在の時刻はわかりません
Alex

9
上位の回答はすべて間違っています。process.hrtime()現在の時刻を返しません。

175

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を参照してください

私はNode.jsにこの関数を実装しましたprocess.hrtime。これは、プログラムの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は高解像度タイマーを提供していますか?


27
ベンチマークを行うには、前の呼び出しの結果を渡してprocess.hrtime()diffを取得できることに注意してください。例えばvar startTime = process.hrtime();そしてその後var diff = process.hrtime(startTime);
Justin Warkentin、2014

5
秒をマイクロ秒に変換するときは時間単位を確認してください。console.log(hrTime [0] * 1000000 + hrTime [1] / 1000)
itaifrenkel

このエラーを指摘してくれてありがとう、itaifrenkel!変換コードを修正しました。
Myrne Stol、2014

2
すべきではrequire("performance.now")ないrequire("performance-now")
UpTheCreek 14

5
process.hrtime()現在の時刻を返しません。

21
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');
  }

};

14
process.hrtime()現在の時刻を返しません。

あなたはどのOsを持っていますか?
Abdennour TOUMI 2017

11

BigIntデータ型は、Node.jsの10.7.0以降でサポートされています。(ブログ投稿のお知らせもご覧ください)。サポートされているこれらのバージョンの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()

8

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

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

OPは、このパッケージを試したがインストールできないと述べた。
Cameron Tacklind

@CameronTacklindああ、確かにそうした-彼らはそれを「拡張」と呼んだ。これを見逃してしまいました。多くの人々が質問(このノードでマイクロタイムをどのように行うか)を介してこの記事にアクセスするので、答えはまだ役に立ちます。
mikemaccana

5

Node.jsナノタイマー

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

タイマーオブジェクトも個別であるため、それぞれ独自のプロセスsetTimeoutまたはsetIntervalプロセスを実行して、好きなだけオブジェクトを作成できます。

ナノタイマーと呼ばれています。見てみな!


2

より精度が高くDate.now()、浮動小数点の精度がミリ秒の場合:

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

2
process.hrtime()は現在の時刻を返しません
マークJ.シュミット

あなたが正しい。ドキュメントから:「これらの時間は過去の任意の時間に相対的であり、時刻とは関係がないため、クロックドリフトの影響を受けません。主な用途は、インターバル間のパフォーマンスを測定することです」nodejs.org/api/process .html#process_process_hrtime_time
ロス

1

hrtime1行で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

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


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


0

私はこのソリューションをそれほど誇りに思っていませんが、次のようにしてマイクロ秒またはナノ秒のタイムスタンプを持つことができます。

const microsecond = () => Number(Date.now() + String(process.hrtime()[1]).slice(3,6))
const nanosecond = () => Number(Date.now() + String(process.hrtime()[1]).slice(3))

// usage
microsecond() // return 1586878008997591
nanosecond()  // return 1586878009000645600

// Benchmark with 100 000 iterations
// Date.now: 7.758ms
// microsecond: 33.382ms
// nanosecond: 31.252ms

ことを知っている:

  • このソリューションは、node.jsのみ機能します
  • これは程度である10から3倍遅いよりDate.now()
  • 奇妙なことに、それは非常に正確に見え、hrTimeは正確にjsタイムスタンプの刻みをたどるようです。
  • あなたは置き換えることができますDate.now()によって、Number(new Date())ミリ秒単位でタイムスタンプを取得します

編集:

ここでは、コンマ付きのマイクロ秒を持つソリューションですが、数値バージョンはjavascriptによってネイティブに丸められます。したがって、毎回同じフォーマットが必要な場合は、そのストリングバージョンを使用する必要があります。

const microsecondWithCommaString = () => (Date.now() + '.' + String(process.hrtime()[1]).slice(3,7))
const microsecondWithComma = () => Number(Date.now() + '.' + String(process.hrtime()[1]).slice(3,7))

microsecondWithCommaString() // return "1586883629984.8997"
microsecondWithComma() // return 1586883629985.966

0

process.hrtime()は現在のtsを提供しません。

これはうまくいくはずです。

 const loadNs       = process.hrtime(),
        loadMs       = new Date().getTime(),
        diffNs       = process.hrtime(loadNs),
        microSeconds = (loadMs * 1e6) + (diffNs[0] * 1e9) + diffNs[1]

  console.log(microSeconds / 1e3)

-8

いい?

Number(process.hrtime().join(''))

3
これはまったく機能しません。使ってはいけません。これらの値は整数であるため、配列の2番目の要素の幅が固定されることはありません。これを文字列として結合するための先行ゼロはありません。
user.friendly '19年

Number(process.hrtime()。map((n、i)=> i?( '000000000' + n).slice(-9):n).join( ''))
Mike
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.