window.performance.now () tương đương trong nodejs?


79

Tôi nghĩ rằng câu hỏi là thẳng về phía trước.

Tôi đang tìm kiếm thứ gì đó tương tự như window.performance.now () trong động cơ V8 nodejs.

Hiện tại tôi chỉ đang sử dụng: -

var now = Date.now();
//do some processing..
console.log("time elapsed:", Date.now() - now);

Nhưng, tôi đọc rằng window.performance.now () chính xác hơn nhiều so với việc sử dụng ngày tháng vì những gì được xác định ở đây .

Câu trả lời:


50

Tôi chỉ đề cập rằng ba trong số những lý do mà tác giả đưa ra cho sự ưu tiên của API định thời trong trình duyệt dường như sẽ không áp dụng trực tiếp cho một tình huống nút và điều thứ tư, sự không chính xác của thời gian Javscript, trích dẫn một bài báo từ năm 2008, và tôi thực sự hết sức thận trọng không dựa vào tài liệu cũ hơn liên quan đến các thông số cụ thể về hiệu suất Javascript, đặc biệt với vòng cải tiến hiệu suất gần đây mà tất cả các công cụ đã thực hiện để hỗ trợ các ứng dụng "HTML5".

Tuy nhiên, để trả lời câu hỏi của bạn, bạn nên xem process.hrtime()

CẬP NHẬT: presentGói (có sẵn npm install present) cung cấp một số đường xung quanh hrtimenếu bạn muốn.

Lưu ý: Kể từ phiên bản 8.5.0 của Node , bạn có thể sử dụng performance.now ()


Đúng, đó chỉ là những gì tôi cần. Cảm ơn. Tôi cũng sẽ xem qua present.
thét lên

Ngoài ra còn có tên thích hợp npmjs.com/package/performance-now
Der Hochstapler

Tác giả nào? Vui lòng bao gồm ngữ cảnh trong câu trả lời của bạn.
Edward D'Souza,

1
Tác giả của liên kết được đăng trong câu hỏi ban đầu, rõ ràng. Câu hỏi là bối cảnh. Thêm nó sẽ là một sự dư thừa, không phải ngữ cảnh.
barry-johnson


30

Đây là một phím tắt process.hrtime()trả về mili giây thay vì micro giây:

function clock(start) {
    if ( !start ) return process.hrtime();
    var end = process.hrtime(start);
    return Math.round((end[0]*1000) + (end[1]/1000000));
}

Sử dụng:

var start = clock();
// do some processing that takes time
var duration = clock(start);
console.log("Took "+duration+"ms");

Sẽ xuất ra một cái gì đó như "Took 200ms"


15

Thế còn?

console.time('FooTimer');
// do the work
console.timeEnd('FooTimer');

1
Hãy cẩn thận với console.time () nếu bạn đang sử dụng hứa hẹn, chờ đợi, v.v. thì cặp time () / timeEnd () dường như hoạt động khi sử dụng trạng thái toàn cục - nếu bạn bấm đồng thời cùng một thẻ, mọi thứ sẽ không hoạt động bình thường.
Rút ngắn

Vì vậy, điều này có thể hiệu quả, nhưng nếu bạn muốn nắm giữ thời gian đó một cách thực dụng thì điều này (process.hrtime ()) là cách duy nhất khác của bạn 'trong quá trình'. Bạn có thể tạo một quy trình cha và xem stdout, nhưng đó là phương sách cuối cùng. CHỈNH SỬA: Hoặc có vẻ như có api thời gian hiệu suất trong nodejs là 8.5+ - nodejs.org/api/…
Eric Hodonsky 12/04/18

1

Đây là phiên bản Typecript với process.hrtime () , dựa trên câu trả lời của NextLocal :

class Benchmark {

    private start = process.hrtime();

    public elapsed(): number {
        const end = process.hrtime(this.start);
        return Math.round((end[0] * 1000) + (end[1] / 1000000));
    }
}

export = Benchmark;

Sử dụng:

import Benchmark = require("./benchmark");

const benchmark = new Benchmark();

console.log(benchmark.elapsed());

1

Tổng hợp và tránh sử dụng perf_hooks

const performance = {
        now: function(start) {
            if ( !start ) return process.hrtime();
            var end = process.hrtime(start);
            return Math.round((end[0]*1000) + (end[1]/1000000));
        }
    }
console.log('performance', performance.now());

1
Tại sao chúng ta muốn tránh perf_hooks?
Spurious

3
Bởi vì nó đã được bổ sung trong Node v8.5.0 nên để tương thích ngược, rằng có lẽ cần thiết trong một số trường hợp ...
loretoparisi

Cảm ơn rất nhiều vì lời giải thích, có ý nghĩa!
Spurious

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.