Node.js'de en doğru zaman damgasını nasıl alabilirim?
ps Node.js sürümüm 0.8.X ve node-microtime uzantısı benim için çalışmıyor (yükleme sırasında çökme)
Node.js'de en doğru zaman damgasını nasıl alabilirim?
ps Node.js sürümüm 0.8.X ve node-microtime uzantısı benim için çalışmıyor (yükleme sırasında çökme)
Yanıtlar:
new Date().getTime()
? Bu, JS'nin size vereceği en doğru olan, milisaniye cinsinden bir zaman damgası verir.
Güncelleme: vaughan'ın belirttiği gibi, process.hrtime()
Node.js içinde mevcut - çözünürlüğü nanosaniyeler ve bu nedenle çok daha yüksek, ayrıca bu daha kesin olması gerektiği anlamına gelmiyor.
Not: Daha açık olmak process.hrtime()
gerekirse , size Array
mevcut yüksek çözünürlüklü gerçek zamanı [saniye, nanosaniye] cinsinden içeren bir demet döndürür
process.hrtime()
Node.js'de "yüksek çözünürlük süresi" üzerinden kullanıma sunulur process.hrtime
. İlk elemanı saniye cinsinden ve ikinci elemanı kalan nanosaniye cinsinden bir dizi döndürür.
Geçerli saati mikrosaniye cinsinden almak için aşağıdakileri yapın:
var hrTime = process.hrtime()
console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)
( Yukarıdaki dönüştürmede bir hataya işaret ettiği için itaifrenkel'e teşekkürler .)
Modern tarayıcılarda, mikrosaniye hassasiyetinde zaman performance.now
. Belgeler için https://developer.mozilla.org/en-US/docs/Web/API/Performance/now adresine bakın .
Node.js için bu işlevin bir uygulamasını yaptım, buna dayanarak, process.hrtime
bir programdaki iki nokta arasındaki zaman farkını yalnızca hesaplamak istiyorsanız, kullanımı nispeten zordur. Bkz. Http://npmjs.org/package/performance-now . Spesifikasyona göre, bu işlev zamanı milisaniye cinsinden bildirir, ancak milisaniyenin altında hassasiyete sahip bir kayan değerdir.
Bu modülün 2.0 Sürümünde, bildirilen milisaniyeler, düğüm işleminin başlatıldığı zamana bağlıdır ( Date.now() - (process.uptime() * 1000)
). Benzer bir zaman damgası istiyorsanız, bunu sonuca eklemeniz gerekir Date.now()
. Ayrıca yeniden hesaplamanız gerektiğini unutmayın Date.now() - (process.uptime() * 1000)
. Hem Date.now
ve process.uptime
hassas ölçümler için son derece güvenilmez.
Geçerli saati mikrosaniye cinsinden almak için bunun gibi bir şey kullanabilirsiniz.
var loadTimeInMS = Date.now()
var performanceNow = require("performance-now")
console.log((loadTimeInMS + performanceNow()) * 1000)
Ayrıca bkz: JavaScript yüksek çözünürlüklü bir zamanlayıcı sağlıyor mu?
process.hrtime()
, bir fark elde etmek için önceki bir çağrının sonucunu geçirebileceğiniz unutulmamalıdır . örneğin var startTime = process.hrtime();
ve sonra var diff = process.hrtime(startTime);
.
require("performance.now")
olmak require("performance-now")
?
now('milli'); // 120335360.999686
now('micro') ; // 120335360966.583
now('nano') ; // 120335360904333
Bilinen 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
Veri tipi node.js 10.7.0 beri desteklenmektedir. ( ayrıca blog yazısı duyurusuna bakın ). Node.js'nin bu desteklenen sürümleri için, process.hrtime([time])
yöntem artık 'eski' olarak kabul edilir ve process.hrtime.bigint()
yöntemle değiştirilir .
bigint
Sürümüprocess.hrtime()
bir akım yüksek çözünürlüklü gerçek zamanlı dönen yöntemlebigint
.
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()
Ayrıca https://github.com/wadey/node-microtime var :
> var microtime = require('microtime')
> microtime.now()
1297448895297028
Node.js nanotimer
process.hrtime
İşlev çağrısının üstüne node.js için bir sarmalayıcı kitaplığı / nesnesi yazdım . Zamanlama senkronize ve asenkron görevler gibi saniye, milisaniye, mikro ve hatta nano cinsinden belirtilen yararlı işlevlere sahiptir ve aşina olunması için yerleşik javascript zamanlayıcısının sözdizimini izler.
Zamanlayıcı nesneleri de ayrıktır, böylece istediğiniz kadar çok nesneye sahip olabilirsiniz, her birinin kendi setTimeout
veya setInterval
işleminin çalışması vardır.
Deniyor nanotimer . Buna bir bak!
Daha fazla hassasiyetle Date.now()
, ancak milisaniyelerle şamandıra hassasiyetinde çalışmak için:
function getTimeMSFloat() {
var hrtime = process.hrtime();
return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}
hrtime
Tek satırda tek numara olarak alın :
const begin = process.hrtime();
// ... Do the thing you want to measure
const nanoSeconds = process.hrtime(begin).reduce((sec, nano) => sec * 1e9 + nano)
Array.reduce
, tek bir bağımsız değişken verildiğinde, dizinin ilk öğesini başlangıç accumulator
değeri olarak kullanır. 0
Başlangıç değeri olarak kullanılabilir ve bu da işe yarar , ama neden fazladan yapalım * 0
.
Hızlı anlamaya yardımcı olmak için yeniden yazma:
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
Kaynak: https://nodejs.org/api/process.html#process_process_hrtime_time
Bu çözümle pek gurur duymuyorum, ancak bu şekilde mikrosaniye veya nanosaniye cinsinden zaman damgasına sahip olabilirsiniz :
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
Biliyorum:
Date.now()
Date.now()
tarafından Number(new Date())
milisaniye cinsinden zaman damgası almak içinDüzenle:
Burada mikrosaniyenin virgülle kullanılması için bir çözüm, ancak sayı sürümü yerel olarak javascript ile yuvarlanacaktır. Yani her seferinde aynı formatı istiyorsanız, onun String versiyonunu kullanmalısınız.
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 () geçerli ts vermez.
Bu çalışmalı.
const loadNs = process.hrtime(),
loadMs = new Date().getTime(),
diffNs = process.hrtime(loadNs),
microSeconds = (loadMs * 1e6) + (diffNs[0] * 1e9) + diffNs[1]
console.log(microSeconds / 1e3)
daha iyi?
Number(process.hrtime().join(''))
Date.now()
Lütfen.