Làm cách nào tôi có thể lấy dấu thời gian chính xác nhất trong Node.js?
ps Phiên bản Node.js của tôi là 0.8.X và phần mở rộng node-microtime không hoạt động đối với tôi (sự cố khi cài đặt)
Làm cách nào tôi có thể lấy dấu thời gian chính xác nhất trong Node.js?
ps Phiên bản Node.js của tôi là 0.8.X và phần mở rộng node-microtime không hoạt động đối với tôi (sự cố khi cài đặt)
Câu trả lời:
new Date().getTime()
? Điều này cung cấp cho bạn dấu thời gian tính bằng mili giây, là dấu thời gian chính xác nhất mà JS sẽ cung cấp cho bạn.
Cập nhật: Như vaughan đã nêu, process.hrtime()
có sẵn trong Node.js - độ phân giải của nó là nano giây và do đó nó cao hơn nhiều, điều này không có nghĩa là nó phải chính xác hơn.
Tái bút: Nói rõ hơn, process.hrtime()
trả về cho bạn một bộ dữ liệu Array
chứa thời gian thực có độ phân giải cao hiện tại trong một [giây, nano giây]
process.hrtime()
Trong Node.js, "thời gian độ phân giải cao" được cung cấp thông qua process.hrtime
. Nó trả về một mảng với phần tử đầu tiên là thời gian tính bằng giây và phần tử thứ hai là nano giây còn lại.
Để có thời gian hiện tại tính bằng micro giây, hãy làm như sau:
var hrTime = process.hrtime()
console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)
(Cảm ơn itaifrenkel đã chỉ ra một lỗi trong quá trình chuyển đổi ở trên.)
Trong các trình duyệt hiện đại, thời gian với độ chính xác micro giây có sẵn dưới dạng performance.now
. Xem https://developer.mozilla.org/en-US/docs/Web/API/Performance/now để biết tài liệu.
Tôi đã thực hiện triển khai hàm này cho Node.js, dựa trên process.hrtime
, hàm này tương đối khó sử dụng nếu bạn chỉ muốn tính toán chênh lệch thời gian giữa hai điểm trong một chương trình. Xem http://npmjs.org/package/performance-now . Theo thông số kỹ thuật, hàm này báo cáo thời gian tính bằng mili giây, nhưng nó là một phao với độ chính xác dưới mili giây.
Trong Phiên bản 2.0 của mô-đun này, mili giây được báo cáo có liên quan đến thời điểm bắt đầu quá trình nút ( Date.now() - (process.uptime() * 1000)
). Bạn cần thêm điều đó vào kết quả nếu bạn muốn một dấu thời gian tương tự như Date.now()
. Cũng lưu ý rằng bạn nên tính toán lại Date.now() - (process.uptime() * 1000)
. Cả hai Date.now
và process.uptime
đều không đáng tin cậy cho các phép đo chính xác.
Để có được thời gian hiện tại tính bằng micro giây, bạn có thể sử dụng một cái gì đó như thế này.
var loadTimeInMS = Date.now()
var performanceNow = require("performance-now")
console.log((loadTimeInMS + performanceNow()) * 1000)
Xem thêm: JavaScript có cung cấp bộ đếm thời gian độ phân giải cao không?
process.hrtime()
để nhận được điểm khác biệt. ví dụ var startTime = process.hrtime();
và sau đó var diff = process.hrtime(startTime);
.
require("performance.now")
có require("performance-now")
?
now('milli'); // 120335360.999686
now('micro') ; // 120335360966.583
now('nano') ; // 120335360904333
Được biết đó now
là:
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');
}
};
Các BigInt
dữ liệu được hỗ trợ kể từ Node.js 10.7.0. ( xem thêm thông báo bài đăng trên blog ). Đối với các phiên bản Node.js được hỗ trợ này, process.hrtime([time])
phương thức hiện được coi là 'kế thừa', được thay thế bằng process.hrtime.bigint()
phương thức.
Các
bigint
phiên bản củaprocess.hrtime()
phương pháp trả lại độ phân giải cao thời gian thực hiện trong mộtbigint
.
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()
Ngoài ra còn có https://github.com/wadey/node-microtime :
> var microtime = require('microtime')
> microtime.now()
1297448895297028
Node.js nanotimer
Tôi đã viết một thư viện / đối tượng trình bao bọc cho node.js trên đầu process.hrtime
lệnh gọi hàm. Nó có các chức năng hữu ích, như định thời gian cho các tác vụ đồng bộ và không đồng bộ, được chỉ định theo giây, mili giây, micro hoặc thậm chí nano và tuân theo cú pháp của bộ đếm thời gian javascript được tích hợp sẵn để trở nên quen thuộc.
Các đối tượng hẹn giờ cũng rời rạc, vì vậy bạn có thể có bao nhiêu tùy thích, mỗi đối tượng đều chạy riêng setTimeout
hoặc setInterval
chạy quá trình.
Nó được gọi là nanotimer . Kiểm tra nó ra!
Để làm việc với độ chính xác cao hơn Date.now()
, nhưng với độ chính xác float là mili giây:
function getTimeMSFloat() {
var hrtime = process.hrtime();
return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}
Nhận hrtime
dưới dạng số duy nhất trong một dòng:
const begin = process.hrtime();
// ... Do the thing you want to measure
const nanoSeconds = process.hrtime(begin).reduce((sec, nano) => sec * 1e9 + nano)
Array.reduce
, khi được cung cấp một đối số, sẽ sử dụng phần tử đầu tiên của mảng làm accumulator
giá trị ban đầu . Người ta có thể sử dụng 0
làm giá trị ban đầu và điều này cũng sẽ hoạt động, nhưng tại sao lại làm thêm * 0
.
Viết lại để giúp hiểu nhanh:
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
Nguồn: https://nodejs.org/api/process.html#process_process_hrtime_time
Tôi không quá tự hào về giải pháp này nhưng bạn có thể có dấu thời gian ở dạng micro giây hoặc nano giây theo cách này:
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
Biết rằng:
Date.now()
Date.now()
bằng Number(new Date())
để lấy dấu thời gian tính bằng mili giâyBiên tập:
Đây là một giải pháp để có micro giây với dấu phẩy, tuy nhiên, phiên bản số sẽ được làm tròn nguyên bản bằng javascript. Vì vậy, nếu bạn muốn có cùng một định dạng, bạn nên sử dụng phiên bản Chuỗi của nó.
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 () không cung cấp ts hiện tại.
Điều này sẽ hoạt động.
const loadNs = process.hrtime(),
loadMs = new Date().getTime(),
diffNs = process.hrtime(loadNs),
microSeconds = (loadMs * 1e6) + (diffNs[0] * 1e9) + diffNs[1]
console.log(microSeconds / 1e3)
tốt hơn?
Number(process.hrtime().join(''))
Date.now()
xin vui lòng.