নোড.জেএস-এ আমি কীভাবে সবচেয়ে সঠিক সময়ের স্ট্যাম্প পেতে পারি?
PS আমার নোড.জেএস এর সংস্করণ 0.8.X এবং নোড-মাইক্রোটাইম এক্সটেনশন আমার পক্ষে কাজ করে না (ইনস্টল করার সময় ক্রাশ)
নোড.জেএস-এ আমি কীভাবে সবচেয়ে সঠিক সময়ের স্ট্যাম্প পেতে পারি?
PS আমার নোড.জেএস এর সংস্করণ 0.8.X এবং নোড-মাইক্রোটাইম এক্সটেনশন আমার পক্ষে কাজ করে না (ইনস্টল করার সময় ক্রাশ)
উত্তর:
new Date().getTime()
? এটি আপনাকে মিলিসেকেন্ডে একটি টাইমস্ট্যাম্প দেয় যা জেএস আপনাকে দেবে সবচেয়ে সঠিক।
আপডেট: যেমন ভান দ্বারা বলা হয়েছে, process.hrtime()
নোড.জেএস এর মধ্যে উপলব্ধ - এটির রেজোলিউশন ন্যানোসেকেন্ড এবং অতএব এটি এর চেয়ে অনেক বেশি, এর অর্থ এই নয় যে এটি আরও সঠিক হতে হবে।
পিএস: process.hrtime()
খালি পরিষ্কার হতে, আপনাকে Array
বর্তমানের উচ্চ-রেজোলিউশন রিয়েল টাইমটি একটি [সেকেন্ড, ন্যানোসেকেন্ডস] সমেত একটি টুপল প্রদান করে
process.hrtime()
নোড.জেজে, "উচ্চ রেজোলিউশন সময়" এর মাধ্যমে উপলব্ধ করা হয় 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 দেখুনডকুমেন্টেশনের জন্য ।
আমি নোড.জেএস এর উপর ভিত্তি করে এই ফাংশনটির একটি বাস্তবায়ন করেছি process.hrtime
, যা আপনার প্রোগ্রামে দুটি পয়েন্টের মধ্যে সময় পার্থক্য গণনা করতে চাইলে তুলনামূলকভাবে কঠিন। Http://npmjs.org/package/performance- এখন দেখুন । বিশেষ হিসাবে, এই ফাংশনটি মিলি সেকেন্ডে সময় প্রতিবেদন করে তবে এটি সাব-মিলিসেকেন্ড যথার্থতার সাথে একটি ভাসা।
এই মডিউলের ২.০ সংস্করণে, নোড প্রক্রিয়াটি ( Date.now() - (process.uptime() * 1000)
) শুরু হওয়ার পরে রিপোর্ট করা মিলিসেকেন্ডগুলি সম্পর্কিত । আপনি যদি অনুরূপ টাইমস্ট্যাম্প চান তবে আপনাকে ফলাফলটিতে এটি যুক্ত করতে হবে Date.now()
। এছাড়াও মনে রাখবেন যে আপনার প্রতিদানটি বার করা উচিত 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 যেহেতু সমর্থিত। ( তাও দেখতে ব্লগ পোস্টে ঘোষণা )। নোড.জেএস এর এই সমর্থিত সংস্করণগুলির জন্য, 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
প্রসেসরথটাইম () বর্তমান টিএস দেবেন না।
এই কাজ করা উচিত.
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()
অনুগ্রহ.