ฉันจะรับการประทับเวลาที่แม่นยำที่สุดใน Node.js ได้อย่างไร
ps เวอร์ชันของ Node.js ของฉันคือ 0.8.X และส่วนขยาย node-microtimeไม่ทำงานสำหรับฉัน (เกิดข้อผิดพลาดเมื่อติดตั้ง)
ฉันจะรับการประทับเวลาที่แม่นยำที่สุดใน Node.js ได้อย่างไร
ps เวอร์ชันของ Node.js ของฉันคือ 0.8.X และส่วนขยาย node-microtimeไม่ทำงานสำหรับฉัน (เกิดข้อผิดพลาดเมื่อติดตั้ง)
คำตอบ:
new Date().getTime()
เหรอ? ซึ่งจะให้การประทับเวลาเป็นมิลลิวินาทีซึ่งเป็นค่าที่แม่นยำที่สุดที่ JS จะให้คุณ
อัปเดต: ตามที่ระบุไว้โดย vaughan process.hrtime()
มีอยู่ใน Node.js - ความละเอียดคือนาโนวินาทีและสูงกว่ามาก แต่ก็ไม่ได้หมายความว่าจะต้องมีความแน่นอนมากขึ้น
PS: เพื่อให้ชัดเจนยิ่งขึ้นให้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()
คุณจำเป็นต้องเพิ่มที่ผลถ้าคุณต้องการการประทับเวลาคล้ายกับ โปรดทราบว่าคุณควรจะคำนวณDate.now() - (process.uptime() * 1000)
ซ้ำ ทั้งสองอย่างDate.now
และprocess.uptime
ไม่น่าเชื่อถืออย่างมากสำหรับการวัดที่แม่นยำ
หากต้องการรับเวลาปัจจุบันในหน่วยไมโครวินาทีคุณสามารถใช้สิ่งนี้ได้
var loadTimeInMS = Date.now()
var performanceNow = require("performance-now")
console.log((loadTimeInMS + performanceNow()) * 1000)
ดูเพิ่มเติม: JavaScript มีตัวจับเวลาความละเอียดสูงหรือไม่
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; dr
process.hrtime.bigint()
process.hrtime()
นอกจากนี้ยังมีhttps://github.com/wadey/node-microtime :
> var microtime = require('microtime')
> microtime.now()
1297448895297028
Node.js nanotimer
ฉันเขียน Wrapper library / object สำหรับ node.js ที่ด้านบนของการ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
แต่ทำไมทำพิเศษ
มีแพ็คเกจ npm ที่เชื่อมโยงกับฟังก์ชัน gettimeofday () ของระบบซึ่งส่งคืนการประทับเวลาที่มีความแม่นยำระดับไมโครวินาทีบน Linux ค้นหา gettimeofday
NPM การโทร C เร็วกว่าprocess.hrtime()
การเขียนซ้ำเพื่อช่วยให้เข้าใจอย่างรวดเร็ว:
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())
รับการประทับเวลาเป็นมิลลิวินาทีแก้ไข:
ต่อไปนี้เป็นวิธีแก้ปัญหาที่จะมีไมโครวินาทีพร้อมลูกน้ำอย่างไรก็ตามเวอร์ชันของตัวเลขจะถูกปัดเศษโดยจาวาสคริปต์ ดังนั้นหากคุณต้องการรูปแบบเดียวกันทุกครั้งคุณควรใช้เวอร์ชัน String
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()
กรุณา.