Node.jsで最も正確なタイムスタンプを取得するにはどうすればよいですか?
ps Node.jsのバージョンが0.8.Xで、node-microtime拡張機能が機能しません(インストール時にクラッシュします)
Node.jsで最も正確なタイムスタンプを取得するにはどうすればよいですか?
ps Node.jsのバージョンが0.8.Xで、node-microtime拡張機能が機能しません(インストール時にクラッシュします)
回答:
new Date().getTime()
?これは、ミリ秒単位のタイムスタンプを提供します。これは、JSが提供する最も正確なものです。
更新:vaughanによって述べられてprocess.hrtime()
いるように、Node.js内で利用可能です-その解像度はナノ秒であるため、はるかに高くなります。これは、より正確である必要があることを意味しません。
PS .:明確にprocess.hrtime()
するためにArray
、現在の高解像度のリアルタイムを含むタプルを[秒、ナノ秒] で返します。
process.hrtime()
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.now
とprocess.uptime
はどちらも、正確な測定には非常に信頼できません。
現在の時間をマイクロ秒で取得するには、次のようなものを使用できます。
var loadTimeInMS = Date.now()
var performanceNow = require("performance-now")
console.log((loadTimeInMS + performanceNow()) * 1000)
process.hrtime()
diffを取得できることに注意してください。例えばvar startTime = process.hrtime();
そしてその後var diff = process.hrtime(startTime);
。
require("performance.now")
ないrequire("performance-now")
?
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');
}
};
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
process.hrtime.bigint()
process.hrtime()
https://github.com/wadey/node-microtimeもあります:
> var microtime = require('microtime')
> microtime.now()
1297448895297028
より精度が高くDate.now()
、浮動小数点の精度がミリ秒の場合:
function getTimeMSFloat() {
var hrtime = process.hrtime();
return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}
hrtime
1行で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
。
迅速な理解を助けるための書き直し:
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
私はこのソリューションをそれほど誇りに思っていませんが、次のようにしてマイクロ秒またはナノ秒のタイムスタンプを持つことができます。
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
ことを知っている:
Date.now()
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
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)
いい?
Number(process.hrtime().join(''))
Date.now()
お願いします。