web-gelistirme-sc.com

Node.js içinde bir microtime nasıl elde edilir?

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 extension benim için çalışmıyor (yükleme sırasında çöküyor) 

69
NiLL

new Date().getTime()? Bu, size JS'nin en doğru vereceği milisaniye cinsinden bir zaman damgası verir.

Güncelleme: vaughan tarafından belirtildiği gibi, process.hrtime(), Node.js içinde kullanılabilir - çözünürlüğü nanosaniyedir ve bu nedenle çok daha yüksektir, bu daha kesin olması gerektiği anlamına gelmez.

Not: Daha açık olmak gerekirse, process.hrtime() size [yüksek saniye cinsinden] saniyede mevcut yüksek çözünürlüklü gerçek zamanı içeren bir Tuple Array verir

75

Node.js dosyasında "yüksek çözünürlük süresi", process.hrtime aracılığıyla kullanılabilir. İlk elemana saniye cinsinden bir dizi, ikinci elemana kalan nanosaniye ile 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)

( itaifrenkel sayesinde yukarıdaki dönüşümdeki hatayı işaret etti.)

Modern tarayıcılarda, mikrosaniye hassasiyetli zaman performance.now şeklinde mevcuttur. Dokümantasyon için https://developer.mozilla.org/en-US/docs/Web/API/Performance/now adresine bakın.

Bu fonksiyonun Node.js için, bir programdaki iki nokta arasındaki zaman farkını hesaplamak istemeniz durumunda kullanması oldukça zor olan process.hrtime 'ya dayanarak bir uygulama yaptım. Bkz. http://npmjs.org/package/performance-now . Spesifikasyona göre, bu işlev zamanı milisaniye cinsinden rapor eder, ancak milisaniyenin altında hassasiyete sahip bir değişkendir.

Bu modülün 2.0 sürümünde, bildirilen milisaniye, düğüm işleminin ne zaman başlatıldığına bağlıdır (Date.now() - (process.uptime() * 1000)). Date.now() işlevine benzer bir zaman damgası istiyorsanız, sonucu buna eklemeniz gerekir. Ayrıca, Date.now() - (process.uptime() * 1000) işlevini yeniden hesaplamanız gerektiğini unutmayın. Hem Date.now hem de process.uptime kesin ölçümler için oldukça güvenilir değildir.

Mikrosaniye cinsinden şimdiki zamanı elde etmek için böyle bir şey kullanabilirsiniz.

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

Ayrıca bakınız: JavaScript yüksek çözünürlüklü bir zamanlayıcı sağlıyor mu?

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

now'nin: 

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 hrTime[0] * 1000000000 + hrTime[1];
  }

};
13
Abdennour TOUMI

Ayrıca https://github.com/wadey/node-microtime :

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

Node.js nanotimer

Node.js için bir sarmalayıcı kitaplığı/nesnesi process.hrtime işlev çağrısı üzerine yazdım. Saniyede, milisaniyede, mikro hatta hatta nano'da zamanlanan senkronize ve asenkron görevleri zamanlama gibi yararlı fonksiyonlara sahiptir ve tanıdık olmak üzere yerleşik javascript zamanlayıcısının sözdizimini izler.

Zamanlayıcı nesneleri de ayrıktır, böylece her biri kendi setTimeout veya setInterval işlemlerini çalıştırarak istediğiniz kadar sayısına sahip olabilirsiniz. 

Buna nanotimer denir. Buna bir bak!

5
krb686

Date.now() işlevinden daha fazla hassasiyetle, ancak yüzdürme hassasiyetinde milisaniye ile çalışmak için:

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

BigInt data tipi, Node.js 10.7.0'dan beri desteklenmektedir. (ayrıca bkz. blog yazısı duyuru). Node.js'nin bu desteklenen sürümleri için, process.hrtime([time]) / yönteminin yerine, artık "- eski" olarak kabul edildi, process.hrtime.bigint() yönteminin yerine.

process.hrtime() yönteminin bigint sürümü, geçerli yüksek çözünürlüklü gerçek zamanı bir bigint içinde döndürür.

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() işlevini kullanın
  • Aksi takdirde - process.hrtime() işlevini kullanın
1
d4nyll

linux'ta bir mikrosaniye hassasiyetli zaman damgası döndüren gettimeofday () işlevine, sisteme bağlanan npm paketleri vardır. Npm gettimeofday dosyasını arayın. C çağrısı process.hrtime() 'den daha hızlı

0
Andras

Tek satırda hrtime tek sayı 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 argüman verildiğinde, dizinin ilk öğesini ilk accumulator değeri olarak kullanır. Biri ilk değer olarak 0 kullanabilir ve bu da işe yarayabilir, ama neden ekstra * 0 kullanıyor?.

0
Cameron Tacklind

Hızlı bir şekilde anlamanıza yardımcı olacak bir tekrar 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

0