Làm thế nào để bạn thực hiện kiểm tra mã JavaScript?


337

Chu kỳ CPU, Sử dụng bộ nhớ, Thời gian thực hiện, v.v.?

Đã thêm: Có một cách định lượng về hiệu suất thử nghiệm trong JavaScript ngoài nhận thức về việc mã chạy nhanh như thế nào?


Bạn có thể muốn xem plugin YSlow cho Firefox.
Rob Wells

7
Điều đó sẽ chỉ cho bạn biết phải mất bao lâu để tải. Tôi nghĩ rằng câu hỏi quan tâm nhiều hơn đến hiệu suất khi nó đang chạy.
Sam Hasler

Nếu bạn muốn sử dụng mã của mình để thực hiện theo cách phổ biến nhất (và chính xác nhất vì bạn có thể trau dồi vào các chức năng cụ thể). Bài đăng này có một ví dụ điển hình về việc sử dụng bộ đếm thời gian (nhưng bạn thực sự nên xem Performance.now nếu bạn có cơ hội): albertech.blogspot.com/2015/07/ trên
jar

1
Để kiểm tra nhanh chóng và dễ dàng trong trình duyệt của bạn, bạn có thể sử dụng jsben.ch
EscapeNetscape

Câu trả lời:


325

Profiler chắc chắn là một cách tốt để có được số, nhưng theo kinh nghiệm của tôi, hiệu suất cảm nhận là tất cả những gì quan trọng đối với người dùng / khách hàng. Ví dụ, chúng tôi đã có một dự án với một hiệp ước Ext mở rộng để hiển thị một số dữ liệu và sau đó một vài lưới Ext được lồng vào nhau. Mọi thứ thực sự được kết xuất khá nhanh, không có thao tác nào mất nhiều thời gian, chỉ có rất nhiều thông tin được hiển thị cùng một lúc, vì vậy nó gây cảm giác chậm cho người dùng.

Chúng tôi đã 'sửa' điều này, không phải bằng cách chuyển sang một thành phần nhanh hơn hoặc tối ưu hóa một số phương thức, mà bằng cách hiển thị dữ liệu trước, sau đó hiển thị các lưới với setTimeout. Vì vậy, thông tin xuất hiện đầu tiên, sau đó các lưới sẽ xuất hiện sau đó một giây. Nhìn chung, phải mất nhiều thời gian xử lý hơn để làm theo cách đó, nhưng với người dùng, hiệu suất nhận thức đã được cải thiện.


Những ngày này, các hồ sơ Chrome và các công cụ khác là phổ biến sẵn và dễ dàng để sử dụng, như là console.time(), console.profile()performance.now(). Chrome cũng cung cấp cho bạn chế độ xem dòng thời gian có thể cho bạn biết điều gì đang giết chết tốc độ khung hình của bạn, nơi người dùng có thể chờ đợi, v.v.

Tìm tài liệu cho tất cả các công cụ này thực sự dễ dàng, bạn không cần câu trả lời SO cho điều đó. 7 năm sau, tôi vẫn sẽ lặp lại lời khuyên về câu trả lời ban đầu của mình và chỉ ra rằng bạn có thể có mã chậm chạy mãi khi người dùng không chú ý đến nó và mã khá nhanh chạy ở nơi họ làm và họ sẽ phàn nàn về mã khá nhanh không đủ nhanh. Hoặc yêu cầu của bạn đối với API máy chủ của bạn mất 220ms. Hoặc một cái gì đó khác như thế. Vấn đề vẫn là nếu bạn lấy một hồ sơ ra và tìm kiếm công việc để làm, bạn sẽ tìm thấy nó, nhưng nó có thể không phải là công việc mà người dùng của bạn cần.


3
Đây là một bước tinh chỉnh sau khi các thuật toán biểu diễn tốt được biết đến được đưa ra.
Rafael Xavier

1
Đây là một câu trả lời thực sự tốt, trong đó nó có một cách tiếp cận thực tế cho hầu hết các tình huống mà câu hỏi mô tả. Tuy nhiên, nó không trả lời câu hỏi , đó là hỏi liệu có cách nào khác để đo lường điều này ngoài nhận thức của người dùng hay không. Toàn bộ thời gian chết, chẳng hạn như khi các nút bị đóng băng, vẫn có thể được đo bằng các phương pháp trong câu trả lời của pramodc và các bình luận kèm theo.
RoboticRenaione

202

Tôi đồng ý rằng hiệu suất nhận thức là thực sự quan trọng. Nhưng đôi khi tôi chỉ muốn tìm ra phương pháp nào để làm một cái gì đó nhanh hơn. Đôi khi sự khác biệt là LỚN và đáng để biết.

Bạn chỉ có thể sử dụng bộ định thời javascript. Nhưng tôi thường có được kết quả nhiều nhất quán hơn bằng cách sử dụng Chrome có nguồn gốc (bây giờ cũng trong Firefox và Safari) phương pháp devTool console.time()&console.timeEnd()

Ví dụ về cách tôi sử dụng nó:

var iterations = 1000000;
console.time('Function #1');
for(var i = 0; i < iterations; i++ ){
    functionOne();
};
console.timeEnd('Function #1')

console.time('Function #2');
for(var i = 0; i < iterations; i++ ){
    functionTwo();
};
console.timeEnd('Function #2')

Kết quả trông như thế này

Cập nhật (4/4/2016):

Chrome canary gần đây đã thêm Cấu hình mức dòng cho tab nguồn công cụ dev cho phép bạn xem chính xác mỗi dòng mất bao lâu để thực thi! nhập mô tả hình ảnh ở đây


Vâng, một trong những điểm thu hút với điều này là nó rất dễ thực hiện. Tôi tự hỏi, việc đăng nhập mỗi lần sẽ lấy một số hiệu suất từ ​​việc thực thi javascript. Giả sử rằng chúng ta có một vòng lặp trong một trò chơi và nó xuất ra nhiều hàng nhật ký. Ví dụ một lần mỗi giây trong 5 phút, đó là 300 hàng. Có ai biết?
K. Kilian Lindberg

Đây có còn hoạt động không? Không xuất hiện trong Chrome.
Học thống kê bằng ví dụ


@ K.KilianLindberg Ghi nhật ký sẽ luôn mất thời gian từ hiệu suất, cũng như bất kỳ mã nào, nhưng a) nó sẽ nhất quán trong các thử nghiệm của bạn và b) bạn không nên đăng nhập bằng mã trực tiếp. Sau khi thử nghiệm trên máy của tôi, ghi nhật ký thời gian chỉ là một phần nhỏ của MS, nhưng nó sẽ tăng thêm khi bạn thực hiện nó.
Polyducks

92

Chúng ta luôn có thể đo thời gian được thực hiện bởi bất kỳ chức năng nào bởi đối tượng ngày đơn giản .

var start = +new Date();  // log start timestamp
function1();
var end =  +new Date();  // log end timestamp
var diff = end - start;

10
Lưu ý rằng giải pháp này trả về chênh lệch tính bằng mili giây
Chris Bier

16
Sử dụng Ngày () không được khuyến khích vì thời gian tính bằng mili giây có thể thay đổi tùy thuộc vào các yếu tố hệ thống. Thay vào đó, hãy sử dụng console.time () và console.timeEnd (). Xem câu trả lời của JQuery Lover để biết thêm chi tiết.
mbokil

44
Thậm chí tốt hơn, sử dụngperformance.now()
edan

1
Trước khi sử dụng Performance.now () vui lòng kiểm tra tính tương thích của trình duyệt. developer.mozilla.org/en-US/docs/Web/API/Performance/
triệt

Ngày không thực sự đại diện cho thời gian đã qua. Kiểm tra bài viết này về nó: sitepoint.com/measuring-javascript-fifts-performance . Performance.now () là dấu thời gian chính xác hơn.
Millsionaire

61

Hãy thử jsPerf . Đây là một công cụ hiệu suất javascript trực tuyến để đo điểm chuẩn và so sánh các đoạn mã. Tôi sử dụng nó mọi lúc.


1
Vì jsPerf không hoạt động vào lúc này , nên các điểm chuẩn rất dễ sử dụng .
mucaho

Tôi cũng khuyên bạn nên dùng nó vì nó cho phép đo ops / giây (nó chạy mã của bạn nhiều lần)
Richard

+9001 (hơn chín nghìn;) cho jsPerf. Tôi thường xuyên sử dụng điều này theo cách tương tự như %timeittrong ipythonvỏ REPL cho mã Python.
amcgregor

37

Hầu hết các trình duyệt hiện đang thực hiện thời gian độ phân giải cao trong performance.now(). Nó vượt trội hơn so với new Date()thử nghiệm hiệu năng vì nó hoạt động độc lập với đồng hồ hệ thống.

Sử dụng

var start = performance.now();

// code being timed...

var duration = performance.now() - start;

Người giới thiệu


2
Thậm chí tốt hơn là sử dụng API thời gian người dùng , được xây dựng dựa trên performance.now().
Chris

30

JSLitmus là một công cụ gọn nhẹ để tạo các bài kiểm tra điểm chuẩn JavaScript đặc biệt

Hãy xem xét hiệu suất giữa function expressionfunction constructor:

<script src="JSLitmus.js"></script>
<script>

JSLitmus.test("new Function ... ", function() { 
    return new Function("for(var i=0; i<100; i++) {}"); 
});

JSLitmus.test("function() ...", function() { 
       return (function() { for(var i=0; i<100; i++) {}  });
});

</script>

Những gì tôi đã làm ở trên là tạo ra function expressionfunction constructorthực hiện cùng một hoạt động. Kết quả là như sau:

Kết quả thực hiện FireFox

Kết quả thực hiện FireFox

Kết quả hiệu suất IE

Kết quả hiệu suất IE


Trang JSLitmus được liên kết chứa các liên kết tải xuống bị hỏng. Tôi đã tìm thấy JSLitmus (cho trình duyệt) và jslitmus (cho NodeJS, chữ thường!).
Rob W

16

Một số người đang đề xuất các trình cắm và / hoặc trình duyệt cụ thể. Tôi sẽ không vì chúng chỉ thực sự hữu ích cho một nền tảng đó; bản chạy thử trên Firefox sẽ không dịch chính xác sang IE7. Xem xét 99.999999% các trang web có nhiều trình duyệt truy cập chúng, bạn cần kiểm tra hiệu suất trên tất cả các nền tảng phổ biến.

Đề nghị của tôi sẽ là giữ điều này trong JS. Tạo một trang điểm chuẩn với tất cả bài kiểm tra JS của bạn và thời gian thực hiện. Bạn thậm chí có thể yêu cầu AJAX gửi lại kết quả cho bạn để giữ cho nó hoàn toàn tự động.

Sau đó chỉ cần rửa và lặp lại trên các nền tảng khác nhau.


5
Điều này là đúng, nhưng trình biên dịch là tốt trong trường hợp có vấn đề mã hóa không liên quan đến vấn đề cụ thể của trình duyệt.
John Boker

1
Chắc chắn rồi! Vâng, họ sẽ bắt gặp các vấn đề "mã hóa xấu" chung và các vấn đề cụ thể rất tốt để thực hiện gỡ lỗi thực tế, nhưng đối với thử nghiệm trường hợp sử dụng chung, bạn sẽ được hưởng lợi từ thứ gì đó chạy trên tất cả các nền tảng.
Oli

2
+1 trên lưu ý rằng điều này là đúng, nhưng có một hồ sơ như Fireorms vẫn rất tuyệt, nếu không cần thiết, để tìm ra các nút cổ chai.
Pekka

1
" Xem xét 99.999999% các trang web " Tôi nghĩ rằng bạn đã tạo ra điều đó: - /
RobG

@RobG Tôi có thể nói quá một hoặc hai chữ số thập phân, nhưng ý tưởng rằng nền tảng phát triển của bạn có thể sẽ không giống với nền tảng triển khai của bạn.
Oli

11

Tôi có một công cụ nhỏ nơi tôi có thể nhanh chóng chạy các trường hợp thử nghiệm nhỏ trong trình duyệt và ngay lập tức nhận được kết quả:

Kiểm tra tốc độ JavaScript

Bạn có thể chơi với mã và tìm ra kỹ thuật nào tốt hơn trong trình duyệt được thử nghiệm.


Cảm ơn, đây chỉ là những gì tôi đang tìm kiếm.
Joseph Sheedy


9

Đây là một chức năng đơn giản hiển thị thời gian thực hiện của một chức năng được thông qua:

var perf = function(testName, fn) {
    var startTime = new Date().getTime();
    fn();
    var endTime = new Date().getTime();
    console.log(testName + ": " + (endTime - startTime) + "ms");
}


4

Câu trả lời nhanh

Trên jQuery (cụ thể hơn là trên Sizzle), chúng tôi sử dụng điều này (kiểm tra tổng thể và mở speed / index.html trên trình duyệt của bạn), lần lượt sử dụng điểm chuẩn.js . Điều này được sử dụng để kiểm tra hiệu suất thư viện.

Câu trả lời dài

Nếu người đọc không biết sự khác biệt giữa điểm chuẩn, khối lượng công việc và trình biên dịch, trước tiên hãy đọc một số nền tảng kiểm tra hiệu suất trên phần "readme 1st" của spec.org . Đây là để thử nghiệm hệ thống, nhưng hiểu được nền tảng này cũng sẽ giúp thử nghiệm hoàn hảo cho JS. Một số điểm nổi bật:

Điểm chuẩn là gì?

Điểm chuẩn là "tiêu chuẩn đo lường hoặc đánh giá" (Từ điển II của Webster). Một điểm chuẩn máy tính thường là một chương trình máy tính thực hiện một tập hợp các thao tác được xác định nghiêm ngặt - một khối lượng công việc - và trả về một số dạng kết quả - một số liệu - mô tả cách thức máy tính được thử nghiệm thực hiện. Số liệu đo điểm chuẩn của máy tính thường đo tốc độ: khối lượng công việc đã hoàn thành nhanh như thế nào; hoặc thông lượng: có bao nhiêu đơn vị khối lượng công việc trên mỗi đơn vị thời gian đã được hoàn thành. Chạy cùng một chuẩn máy tính trên nhiều máy tính cho phép thực hiện so sánh.

Tôi có nên điểm chuẩn cho ứng dụng của riêng mình?

Lý tưởng nhất, thử nghiệm so sánh tốt nhất cho các hệ thống sẽ là ứng dụng của riêng bạn với khối lượng công việc của riêng bạn. Thật không may, thường không thực tế khi có được một số lượng lớn các phép đo đáng tin cậy, có thể lặp lại và có thể so sánh cho các hệ thống khác nhau bằng cách sử dụng ứng dụng của riêng bạn với khối lượng công việc của riêng bạn. Các vấn đề có thể bao gồm tạo ra một trường hợp thử nghiệm tốt, mối quan tâm bảo mật, khó khăn trong việc đảm bảo các điều kiện tương đương, thời gian, tiền bạc hoặc các ràng buộc khác.

Nếu không phải là ứng dụng của riêng tôi thì sao?

Bạn có thể cân nhắc sử dụng điểm chuẩn được chuẩn hóa làm điểm tham chiếu. Lý tưởng nhất, một điểm chuẩn được chuẩn hóa sẽ có thể mang theo được và có thể đã được chạy trên các nền tảng mà bạn quan tâm. Tuy nhiên, trước khi xem xét kết quả, bạn cần chắc chắn rằng bạn hiểu mối tương quan giữa nhu cầu ứng dụng / máy tính của bạn và những gì điểm chuẩn đang đo. Các điểm chuẩn có giống với các loại ứng dụng bạn chạy không? Khối lượng công việc có đặc điểm tương tự? Dựa trên câu trả lời của bạn cho những câu hỏi này, bạn có thể bắt đầu xem điểm chuẩn có thể gần đúng với thực tế của bạn như thế nào.

Lưu ý: Một điểm chuẩn được tiêu chuẩn hóa có thể đóng vai trò là điểm tham chiếu. Tuy nhiên, khi bạn đang thực hiện lựa chọn nhà cung cấp hoặc sản phẩm, SPEC không cho rằng bất kỳ điểm chuẩn nào có thể thay thế điểm chuẩn cho ứng dụng thực tế của chính bạn.

Kiểm tra hiệu năng JS

Lý tưởng nhất, thử nghiệm hoàn hảo tốt nhất sẽ là sử dụng ứng dụng của riêng bạn với khối lượng công việc của riêng bạn chuyển đổi những gì bạn cần kiểm tra: các thư viện, máy móc khác nhau, v.v.

Nếu điều này là không khả thi (và thường thì không). Bước quan trọng đầu tiên: xác định khối lượng công việc của bạn. Nó sẽ phản ánh khối lượng công việc của ứng dụng của bạn. Trong buổi nói chuyện này , Vyacheslav Egorov nói về khối lượng công việc tồi tệ mà bạn nên tránh.

Sau đó, bạn có thể sử dụng các công cụ như điểm chuẩn.js để hỗ trợ bạn thu thập số liệu, thường là tốc độ hoặc thông lượng. Trên Sizzle, chúng tôi quan tâm đến việc so sánh các bản sửa lỗi hoặc thay đổi ảnh hưởng đến hiệu suất hệ thống của thư viện.

Nếu một cái gì đó đang thực hiện xấu, bước tiếp theo của bạn là tìm kiếm các nút thắt cổ chai.

Làm thế nào để tôi tìm thấy nút cổ chai? Hồ sơ

Cách tốt nhất để hồ sơ thực hiện javascript là gì?


3

Tôi thấy thời gian thực hiện là biện pháp tốt nhất.


Trái ngược với những gì? Tôi không chắc là tôi hiểu.
Pekka

Trái ngược với câu hỏi áp phích gốc: "Chu kỳ CPU, Sử dụng bộ nhớ, Thời gian thực hiện, v.v.?"
cười thầm


2

Tôi thường chỉ kiểm tra hiệu suất javascript, kịch bản chạy trong bao lâu. jQuery Lover đã đưa ra một liên kết bài viết tốt để kiểm tra hiệu suất mã javascript , nhưng bài viết chỉ cho thấy cách kiểm tra mã javascript của bạn chạy trong bao lâu. Tôi cũng khuyên bạn nên đọc bài viết có tên "5 mẹo để cải thiện mã jQuery của bạn trong khi làm việc với các tập dữ liệu khổng lồ".


2

Đây là một lớp có thể tái sử dụng cho hiệu suất thời gian. Ví dụ được bao gồm trong mã:

/*
     Help track time lapse - tells you the time difference between each "check()" and since the "start()"

 */
var TimeCapture = function () {
    var start = new Date().getTime();
    var last = start;
    var now = start;
    this.start = function () {
        start = new Date().getTime();
    };
    this.check = function (message) {
        now = (new Date().getTime());
        console.log(message, 'START:', now - start, 'LAST:', now - last);
        last = now;
    };
};

//Example:
var time = new TimeCapture();
//begin tracking time
time.start();
//...do stuff
time.check('say something here')//look at your console for output
//..do more stuff
time.check('say something else')//look at your console for output
//..do more stuff
time.check('say something else one more time')//look at your console for output

1

UX Profiler tiếp cận vấn đề này từ góc độ người dùng. Nó nhóm tất cả các sự kiện trình duyệt, hoạt động mạng, v.v. do một số hành động của người dùng (nhấp chuột) và xem xét tất cả các khía cạnh như độ trễ, thời gian chờ, v.v.


1

Tôi đã tìm kiếm một cái gì đó tương tự nhưng tìm thấy điều này.

https://jsbench.me/

Nó cho phép so sánh giữa các bên và sau đó bạn cũng có thể chia sẻ kết quả.


0

Nguyên tắc vàng là KHÔNG theo bất kỳ trường hợp nào khóa trình duyệt người dùng của bạn. Sau đó, tôi thường xem xét thời gian thực hiện, tiếp theo là sử dụng bộ nhớ (trừ khi bạn đang làm điều gì đó điên rồ, trong trường hợp đó có thể là ưu tiên cao hơn).


0

Kiểm tra hiệu suất đã trở thành một từ thông dụng vào cuối nhưng điều đó không có nghĩa là kiểm tra hiệu suất không phải là một quá trình quan trọng trong QA hoặc ngay cả sau khi sản phẩm đã được xuất xưởng. Và trong khi tôi phát triển ứng dụng, tôi sử dụng nhiều công cụ khác nhau, một số trong số chúng được đề cập ở trên như chrome Profiler, tôi thường nhìn vào SaaS hoặc một thứ gì đó mở ra mà tôi có thể đi và quên nó đi cho đến khi tôi nhận được thông báo rằng có gì đó không ổn .

Có rất nhiều công cụ tuyệt vời sẽ giúp bạn theo dõi hiệu suất mà không cần phải nhảy qua các vòng chỉ để thiết lập một số cảnh báo cơ bản. Dưới đây là một vài điều mà tôi nghĩ là đáng để kiểm tra cho chính mình.

  1. Sematext.com
  2. Datadog.com
  3. Thời gian hoạt động.com
  4. Smartbear.com
  5. Solarwinds.com

Để thử và vẽ một bức tranh rõ ràng hơn, đây là một hướng dẫn nhỏ về cách thiết lập giám sát cho một ứng dụng phản ứng.


-1

Đây là một cách tốt để thu thập thông tin hiệu suất cho hoạt động cụ thể.

start = new Date().getTime(); 
for (var n = 0; n < maxCount; n++) {
/* perform the operation to be measured *//
}
elapsed = new Date().getTime() - start;
assert(true,"Measured time: " + elapsed);
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.