Làm cách nào để có được microtime trong Node.js?


98

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:


102

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 Arraychứa thời gian thực có độ phân giải cao hiện tại trong một [giây, nano giây]


91
Date.now()xin vui lòng.
jAndy

48
Sử dụngprocess.hrtime()
vaughan

2
Tôi phải đồng ý. Câu trả lời này hoàn toàn sai. Xem câu trả lời dưới đây của @Meryn Stol để biết câu trả lời chính xác.
Justin Warkentin

11
process.hrtime () Những thời gian này tương đối với một thời gian tùy ý trong quá khứ, và không liên quan đến thời gian trong ngày và do đó không chịu sự trôi dạt của đồng hồ. Việc sử dụng chính là để đo hiệu suất giữa các khoảng thời gian. Vì vậy, nó không cung cấp thời gian hiện tại
Alex

9
Tất cả các câu trả lời hàng đầu đều sai. process.hrtime()không trả về thời gian hiện tại.

175

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.nowprocess.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?


27
Cần lưu ý rằng để thực hiện một điểm chuẩn, bạn có thể vượt qua kết quả của một lần gọi trước đó process.hrtime()để nhận được điểm khác biệt. ví dụ var startTime = process.hrtime();và sau đó var diff = process.hrtime(startTime);.
Justin Warkentin

5
Vui lòng kiểm tra đơn vị thời gian khi chuyển đổi giây thành micro giây. console.log (hrTime [0] * 1000000 + hrTime [1] / 1000)
itaifrenkel

Cảm ơn vì đã chỉ ra lỗi này, itaifrenkel! Tôi đã sửa mã chuyển đổi.
Myrne Stol

2
Không nên require("performance.now")require("performance-now")?
UpTheCreek

5
process.hrtime()không trả về thời gian hiện tại.

21
now('milli'); //  120335360.999686
now('micro') ; // 120335360966.583
now('nano') ; //  120335360904333

Được biết đó nowlà:

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()không trả về thời gian hiện tại.

Os nào bạn có?
Abdennour TOUMI

11

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 bigintphiên bản của process.hrtime()phương pháp trả lại độ phân giải cao thời gian thực hiện trong một 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

  • Node.js 10.7.0+ - Sử dụng process.hrtime.bigint()
  • Nếu không - Sử dụng process.hrtime()

8

Ngoài ra còn có https://github.com/wadey/node-microtime :

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

OP nói rằng họ đã thử gói này và không thể cài đặt nó.
Cameron Tacklind 14/09/19

@CameronTacklind Ah họ đã thực sự làm như vậy - họ gọi nó là một 'tiện ích mở rộng'; khiến tôi nhớ điều này. Vì rất nhiều người đến với bài viết này thông qua câu hỏi - đó là cách thực hiện một microtime trên nút - nên câu trả lời vẫn hữu ích.
mikemaccana 23/09/19

5

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.hrtimelệ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 setTimeouthoặc setIntervalchạy quá trình.

Nó được gọi là nanotimer . Kiểm tra nó ra!


2

Để 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;
}

2
process.hrtime () không trả về thời gian hiện tại
Marc J. Schmidt

Bạn đúng. Từ tài liệu: "Những thời gian này có liên quan đến thời gian tùy ý trong quá khứ và không liên quan đến thời gian trong ngày và do đó không bị trôi theo đồng hồ. Mục đích chính là để đo hiệu suất giữa các khoảng thời gian" nodejs.org/api/process .html # process_process_hrtime_time
Ross

1

Nhận hrtimedướ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 accumulatorgiá trị ban đầu . Người ta có thể sử dụng 0là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.


0

có các gói npm liên kết với hàm gettimeofday () của hệ thống, hàm này trả về dấu thời gian chính xác micro giây trên Linux. Tìm kiếm npm gettimeofday. Gọi C nhanh hơnprocess.hrtime()


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


0

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:

  • Giải pháp này chỉ hoạt động với node.js ,
  • Điều này chậm hơn khoảng 3 đến 10 lần so vớiDate.now()
  • Thật kỳ lạ, nó có vẻ rất chính xác, hrTime dường như theo đúng dấu thời gian của js.
  • Bạn có thể thay thế Date.now()bằng Number(new Date())để lấy dấu thời gian tính bằng mili giây

Biê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

0

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)

-8

tốt hơn?

Number(process.hrtime().join(''))

3
Điều này không hoạt động ở tất cả. KHÔNG ĐƯỢC DÙNG. Vì các giá trị này là số nguyên nên phần tử thứ hai của mảng sẽ không bao giờ có chiều rộng cố định. Các số không đứng đầu không có ở đó để nối kết này thành một chuỗi.
user.friendly

Number (process.hrtime (). Map ((n, i) => i? ('000000000' + n) .slice (-9): n) .join (''))
Mike
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.