Node.js में माइक्रोटाइम कैसे प्राप्त करें?


98

मैं Node.js में सबसे सटीक समय टिकट कैसे प्राप्त कर सकता हूं?

ps Node.js का मेरा संस्करण 0.8.X है और नोड-माइक्रोटाइम एक्सटेंशन मेरे लिए काम नहीं करता है (इंस्टॉल पर क्रैश)

जवाबों:


102

new Date().getTime()? यह आपको मिलीसेकंड में टाइमस्टैम्प देता है, जो कि जेएस आपको देगा सबसे सटीक है।

अद्यतन: जैसा कि vaughan द्वारा कहा गया है, process.hrtime()Node.js के भीतर उपलब्ध है - इसका रिज़ॉल्यूशन नैनोसेकंड है और इसलिए यह बहुत अधिक है, इसका मतलब यह भी नहीं है कि इसे अधिक सटीक होना चाहिए।

पुनश्च: बस स्पष्ट होने के लिए, process.hrtime()आपको एक Arrayउच्च गति देता है जिसमें वर्तमान उच्च-रिज़ॉल्यूशन वास्तविक समय होता है [सेकंड, नैनोसेकंड]


91
Date.now()कृप्या।
jAndy

48
उपयोगprocess.hrtime()
विघ्न

2
मुझे सहमत होना होगा। यह जवाब पूरी तरह से गलत है। सही उत्तर के लिए @Meryn Stol द्वारा उत्तर देखें।
जस्टिन वर्केंटिन

11
process.hrtime () ये समय अतीत में एक मनमाने समय के सापेक्ष है, और दिन के समय से संबंधित नहीं है और इसलिए घड़ी के बहाव के अधीन नहीं है। प्राथमिक उपयोग अंतराल के बीच प्रदर्शन को मापने के लिए है। तो यह वर्तमान समय नहीं देता
एलेक्स

9
शीर्ष के सभी उत्तर गलत हैं। process.hrtime()वर्तमान समय वापस नहीं करता है।

175

Node.js में, "उच्च रिज़ॉल्यूशन समय" के माध्यम से उपलब्ध कराया जाता है process.hrtime। यह सेकंड में समय पहले तत्व के साथ एक सरणी देता है, और दूसरा तत्व शेष नैनोसेकंड।

माइक्रोसेकंड में वर्तमान समय प्राप्त करने के लिए, निम्नलिखित करें:

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, जो कि आपके प्रोग्राम में दो बिंदुओं के बीच के समय के अंतर की गणना करना चाहते हैं, जिसका उपयोग करना अपेक्षाकृत कठिन है। Http://npmjs.org/package/performance-now देखें । कल्पना के अनुसार, यह फ़ंक्शन मिलीसेकंड में समय की रिपोर्ट करता है, लेकिन यह उप-मिलीसेकंड परिशुद्धता के साथ एक फ्लोट है।

इस मॉड्यूल के संस्करण 2.0 में, नोड प्रक्रिया शुरू होने ( Date.now() - (process.uptime() * 1000)) के अनुसार रिपोर्ट किए गए मिलीसेकंड सापेक्ष हैं । यदि आप टाइमस्टैम्प के समान चाहते हैं तो आपको परिणाम में इसे जोड़ना होगा Date.now()। यह भी ध्यान दें कि आपको recompute होना चाहिए Date.now() - (process.uptime() * 1000)। दोनों Date.nowऔर process.uptimeसटीक मापन के लिए अत्यधिक अविश्वसनीय हैं।

माइक्रोसेकंड में वर्तमान समय प्राप्त करने के लिए, आप कुछ इस तरह का उपयोग कर सकते हैं।

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

इसे भी देखें: क्या जावास्क्रिप्ट एक उच्च रिज़ॉल्यूशन टाइमर प्रदान करता है?


27
यह ध्यान दिया जाना चाहिए कि एक बेंचमार्क करने के process.hrtime()लिए आप एक अंतर प्राप्त करने के लिए पिछले कॉल का परिणाम पारित कर सकते हैं । जैसे var startTime = process.hrtime();और फिर var diff = process.hrtime(startTime);
जस्टिन वॉर्केंटिन

5
सेकंड्स को माइक्रोसेकंड में परिवर्तित करते समय कृपया समय इकाइयों की जांच करें। कंसोल.लॉग (hrTime [0] * 1000000 + hrTime [1] / 1000)
itaifrenkel

इस त्रुटि को इंगित करने के लिए धन्यवाद, itaifrenkel! मैंने रूपांतरण कोड सुधार लिया है।
माय्रन स्टोल

2
नहीं require("performance.now")होना चाहिए require("performance-now")?
उपराष्ट्रपति

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()वर्तमान समय वापस नहीं करता है।

आपके पास कौन सा ओएस है?
अब्देन्नौर TOUMI

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; डॉ

  • Node.js 10.7.0+ - उपयोग करें process.hrtime.bigint()
  • अन्यथा - उपयोग करें process.hrtime()

8

Https://github.com/wadey/node-microtime भी है :

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

ओपी ने कहा कि उन्होंने इस पैकेज की कोशिश की और इसे स्थापित करने के लिए नहीं मिला।
कैमरन टैकलिंड

@CameronTacklind आह उन्होंने वास्तव में किया - उन्होंने इसे 'विस्तार' कहा; जिसने मुझे यह याद दिलाया। चूंकि बहुत से लोग इस लेख के माध्यम से सवाल पर आते हैं - जो कि नोड पर माइक्रोटाइम कैसे करना है - जवाब अभी भी उपयोगी है।
मिकमेकाना

5

नोड.जेएस नैनोटिमर

मैंने process.hrtimeफ़ंक्शन कॉल के शीर्ष पर नोड के लिए एक रैपर लाइब्रेरी / ऑब्जेक्ट लिखा था । यह समय, तुल्यकालिक और अतुल्यकालिक कार्यों की तरह उपयोगी कार्य करता है, सेकंड, मिलीसेकंड, माइक्रो या यहां तक ​​कि नैनो में निर्दिष्ट है, और परिचित होने के लिए जावास्क्रिप्ट टाइमर में निर्मित सिंटैक्स का पालन करता है।

टाइमर ऑब्जेक्ट्स भी असतत हैं, इसलिए आप जितनी चाहें उतनी हो सकती हैं, प्रत्येक की अपनी setTimeoutया setIntervalप्रक्रिया चल रही है।

इसे नैनोटिमर कहा जाता है । इसकी जांच - पड़ताल करें!


2

की तुलना में अधिक सटीकता के साथ काम करने के लिए Date.now(), लेकिन फ्लोट परिशुद्धता में मिलीसेकंड के साथ:

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

2
process.hrtime () वर्तमान समय में वापस नहीं आता है
मार्क जे। श्मिट

आप सही हे। डॉक्स से: "ये समय अतीत में एक मनमाने समय के सापेक्ष होता है, और दिन के समय से संबंधित नहीं होता है और इसलिए घड़ी के बहाव के अधीन नहीं होता है। प्राथमिक उपयोग अंतराल के बीच प्रदर्शन को मापने के लिए होता है" नोडज्स.ओआरपी / पीआईओप्रोसेस। .html # process_process_hrtime_time
रॉस

1

hrtimeएक पंक्ति में एकल संख्या प्राप्त करें :

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

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

पता है कि:

  • यह समाधान विशेष रूप से नोड.जेएस के साथ काम करता है ,
  • की तुलना में यह लगभग 3 से 10 गुना धीमा हैDate.now()
  • अजीब तरह से, यह बहुत सटीक लगता है, hrTime वास्तव में js टाइमस्टैम्प टिक का पालन करता है।
  • आप की जगह ले सकता Date.now()से Number(new Date())मिलीसेकेंड में टाइमस्टैम्प प्राप्त करने के लिए

संपादित करें:

यहाँ अल्पविराम के साथ माइक्रोसेकंड होने का एक समाधान है, हालांकि, संख्या संस्करण को मूल रूप से जावास्क्रिप्ट द्वारा गोल किया जाएगा। इसलिए यदि आप हर बार एक ही प्रारूप चाहते हैं, तो आपको इसके स्ट्रिंग संस्करण का उपयोग करना चाहिए।

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
यह बिल्कुल काम नहीं करता है। प्रयोग नहीं करें। चूंकि ये मान पूर्णांक हैं, इसलिए सरणी के दूसरे तत्व की निश्चित चौड़ाई कभी नहीं होगी। एक स्ट्रिंग के रूप में शामिल होने के लिए अग्रणी शून्य नहीं हैं।
user.friendly

संख्या (process.hrtime) ()। Map ((n, i) => i? ('000000000' + n) .slice (-9): n) .join (''))
माइक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.