Node.js'de mikro zaman nasıl edinilir?


Yanıtlar:


103

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 Arraymevcut yüksek çözünürlüklü gerçek zamanı [saniye, nanosaniye] cinsinden içeren bir demet döndürür


91
Date.now()Lütfen.
jAndy

51
Kullanımprocess.hrtime()
vaughan

3
Katılıyorum. Bu cevap tamamen yanlış. Doğru cevap için @Meryn Stol tarafından verilen aşağıdaki cevaba bakınız.
Justin Warkentin

11
process.hrtime () Bu zamanlar geçmişte rastgele bir zamana bağlıdır ve günün saatiyle ilgili değildir ve bu nedenle saat sapmasına tabi değildir. Birincil kullanım, aralıklar arasındaki performansı ölçmek içindir. Yani şu anki saati vermiyor
Alex

9
En iyi yanıtların tümü yanlış. process.hrtime()şimdiki zamanı döndürmez.

180

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.hrtimebir 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.nowve process.uptimehassas ö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?


27
Bir kıyaslama yapmak için 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);.
Justin Warkentin

5
Lütfen saniyeyi mikrosaniyelere dönüştürürken zaman birimlerini kontrol edin. console.log (hrTime [0] * 1000000 + hrTime [1] / 1000)
itaifrenkel

Bu hatayı işaret ettiğiniz için teşekkürler, itaifrenkel! Dönüşüm kodunu düzelttim.
Myrne Stol

2
Gerekmiyor require("performance.now")olmak require("performance-now")?
UpTheCreek

6
process.hrtime()şimdiki zamanı döndürmez.

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

};

15
process.hrtime()şimdiki zamanı döndürmez.

hangi os sende var?
Abdennour TOUMI

Uyarı: "mikro" ve "nano" Numarayı aşacak gibi görünüyor. Bunların çalışması için önce bunları BigInt'e dönüştürmeniz gerekebilir.
DoomGoober

14

BigIntVeri 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 .

bigintSürümü process.hrtime()bir akım yüksek çözünürlüklü gerçek zamanlı dönen yöntemle 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+ - Kullanım process.hrtime.bigint()
  • Aksi takdirde - Kullanın process.hrtime()

8

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

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

OP, bu paketi denediklerini ve yükleyemediklerini belirtti.
Cameron Tacklind

@CameronTacklind Ah gerçekten yaptılar - buna 'uzantı' dediler; bu da bana bunu özletti. Pek çok insan bu makaleye, düğümde mikro zamanın nasıl yapılacağı sorusuyla geldiğinden, cevap hala yararlıdır.
mikemaccana

5

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 setTimeoutveya setIntervalişleminin çalışması vardır.

Deniyor nanotimer . Buna bir bak!


2

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

2
process.hrtime () şimdiki zamanı döndürmüyor
Marc J. Schmidt

Haklısın. Dokümanlardan: "Bu zamanlar geçmişte rastgele bir zamana bağlıdır ve günün saatiyle ilgili değildir ve bu nedenle saat sapmasına tabi değildir. Birincil kullanım, aralıklar arasındaki performansı ölçmek içindir" nodejs.org/api/process .html # process_process_hrtime_time
Ross

1

hrtimeTek 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ıç accumulatordeğeri olarak kullanır. 0Başlangıç ​​değeri olarak kullanılabilir ve bu da işe yarar , ama neden fazladan yapalım * 0.


0

Linux'ta bir mikrosaniye hassas zaman damgası döndüren gettimeofday () işlevine bağlanan npm paketleri vardır. Npm arayın gettimeofday. C'yi aramak daha hızlıdırprocess.hrtime()


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


0

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:

  • Bu çözüm yalnızca node.js ile çalışır ,
  • Bu hakkındadır 3 ila 10 kat daha yavaş dahaDate.now()
  • Garip bir şekilde, çok doğru görünüyor, hrTime tam olarak js zaman damgası işaretlerini takip ediyor gibi görünüyor.
  • Sen yerini alabilir Date.now()tarafından Number(new Date())milisaniye cinsinden zaman damgası almak için

Dü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

0

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)

-8

daha iyi?

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

3
Bu hiç çalışmıyor. KULLANMAYIN. Bu değerler tamsayı olduğundan, dizinin ikinci elemanı hiçbir zaman sabit genişliğe sahip olmayacaktır. Bunun bir dizge olarak birleştirilmesi için baştaki sıfırlar yoktur.
user.friendly

Number (process.hrtime (). Map ((n, i) => i? ['000000000' + n) .slice (-9): n) .join (''))
Mike
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.