मैं Node.js में सबसे सटीक समय टिकट कैसे प्राप्त कर सकता हूं?
ps Node.js का मेरा संस्करण 0.8.X है और नोड-माइक्रोटाइम एक्सटेंशन मेरे लिए काम नहीं करता है (इंस्टॉल पर क्रैश)
मैं Node.js में सबसे सटीक समय टिकट कैसे प्राप्त कर सकता हूं?
ps Node.js का मेरा संस्करण 0.8.X है और नोड-माइक्रोटाइम एक्सटेंशन मेरे लिए काम नहीं करता है (इंस्टॉल पर क्रैश)
जवाबों:
new Date().getTime()
? यह आपको मिलीसेकंड में टाइमस्टैम्प देता है, जो कि जेएस आपको देगा सबसे सटीक है।
अद्यतन: जैसा कि vaughan द्वारा कहा गया है, process.hrtime()
Node.js के भीतर उपलब्ध है - इसका रिज़ॉल्यूशन नैनोसेकंड है और इसलिए यह बहुत अधिक है, इसका मतलब यह भी नहीं है कि इसे अधिक सटीक होना चाहिए।
पुनश्च: बस स्पष्ट होने के लिए, process.hrtime()
आपको एक Array
उच्च गति देता है जिसमें वर्तमान उच्च-रिज़ॉल्यूशन वास्तविक समय होता है [सेकंड, नैनोसेकंड]
process.hrtime()
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)
इसे भी देखें: क्या जावास्क्रिप्ट एक उच्च रिज़ॉल्यूशन टाइमर प्रदान करता है?
process.hrtime()
लिए आप एक अंतर प्राप्त करने के लिए पिछले कॉल का परिणाम पारित कर सकते हैं । जैसे 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; डॉ
process.hrtime.bigint()
process.hrtime()
Https://github.com/wadey/node-microtime भी है :
> var microtime = require('microtime')
> microtime.now()
1297448895297028
नोड.जेएस नैनोटिमर
मैंने process.hrtime
फ़ंक्शन कॉल के शीर्ष पर नोड के लिए एक रैपर लाइब्रेरी / ऑब्जेक्ट लिखा था । यह समय, तुल्यकालिक और अतुल्यकालिक कार्यों की तरह उपयोगी कार्य करता है, सेकंड, मिलीसेकंड, माइक्रो या यहां तक कि नैनो में निर्दिष्ट है, और परिचित होने के लिए जावास्क्रिप्ट टाइमर में निर्मित सिंटैक्स का पालन करता है।
टाइमर ऑब्जेक्ट्स भी असतत हैं, इसलिए आप जितनी चाहें उतनी हो सकती हैं, प्रत्येक की अपनी setTimeout
या setInterval
प्रक्रिया चल रही है।
इसे नैनोटिमर कहा जाता है । इसकी जांच - पड़ताल करें!
की तुलना में अधिक सटीकता के साथ काम करने के लिए Date.now()
, लेकिन फ्लोट परिशुद्धता में मिलीसेकंड के साथ:
function getTimeMSFloat() {
var hrtime = process.hrtime();
return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}
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
।
त्वरित समझ में मदद करने के लिए एक फिर से लिखना:
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())
मिलीसेकेंड में टाइमस्टैम्प प्राप्त करने के लिएसंपादित करें:
यहाँ अल्पविराम के साथ माइक्रोसेकंड होने का एक समाधान है, हालांकि, संख्या संस्करण को मूल रूप से जावास्क्रिप्ट द्वारा गोल किया जाएगा। इसलिए यदि आप हर बार एक ही प्रारूप चाहते हैं, तो आपको इसके स्ट्रिंग संस्करण का उपयोग करना चाहिए।
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()
कृप्या।