Làm cách nào để đo lường Hiệu suất của Chu kỳ thông báo của ứng dụng AngularJS?


82

Cách đơn giản để đo khoảng thời gian của chu kỳ tiêu hóa anglejs là gì? Có nhiều phương pháp khác nhau để phân tích hiệu suất của chu trình tiêu hóa, tuy nhiên, mỗi phương pháp đều đi kèm với những lợi ích riêng của nó:

  • Hồ sơ Chrome: Quá nhiều chi tiết, không chia nhỏ chu trình thông báo một cách dễ tìm
  • Batarang (plugin trình duyệt AngularJS): Quá nhiều chi phí, tốc độ làm mới chậm, bùng nổ với các ứng dụng lớn.

... phải có một cách tốt hơn?! 1?

Câu trả lời:


148

Đây là một bí mật. Trong các công cụ dành cho nhà phát triển chrome, hãy chạy cấu hình cpu. Sau khi bạn ngừng chụp, ở dưới cùng của màn hình là một hình tam giác xuống bên cạnh "Nặng (Bottom Up)". Nhấp vào hình tam giác và chọn "Biểu đồ ngọn lửa". Khi bạn đang ở chế độ Biểu đồ ngọn lửa, bạn có thể thu phóng và xoay để xem các chu kỳ thông báo, thời gian diễn ra và chính xác các chức năng đang được gọi. Biểu đồ ngọn lửa cực kỳ hữu ích để theo dõi các vấn đề về tải trang, các vấn đề về hiệu suất ng-lặp lại, các vấn đề về chu trình thông báo! Tôi thực sự không biết làm thế nào tôi có thể gỡ lỗi và lập hồ sơ trước Biểu đồ ngọn lửa. Đây là một ví dụ:

Biểu đồ ngọn lửa trong các công cụ dành cho nhà phát triển Chrome


10
Cảm ơn. Chỉ cần thử nó và nó có vẻ rất hữu ích. Bạn có thể đăng một đoạn video giới thiệu ngắn về cách bạn có thể sử dụng nó trên một trang web để phát hiện và sửa chữa sự cố về hiệu suất không? Nó sẽ rất thú vị. Cảm ơn một lần nữa.
Soferio

3
Đây dường như chỉ được gọi là "biểu đồ" và trông hơi khác trong phiên bản Chrome hiện tại (v. 51.0).
Marc Stober

Google đã phát hành một hướng dẫn chi tiết với viudeos ngắn: developers.google.com/web/tools/chrome-devtools/...
Vaiden

41

Câu trả lời sau sẽ cho bạn biết hiệu suất nhàn rỗi của vòng lặp $ thông báo, tức là, hiệu suất của thông báo khi không có biểu thức đồng hồ nào của bạn thay đổi. Điều này rất hữu ích nếu ứng dụng của bạn có vẻ chậm chạp ngay cả khi chế độ xem không thay đổi. Đối với các tình huống phức tạp hơn, hãy xem câu trả lời của aet.


Nhập nội dung sau vào bảng điều khiển:

angular.element(document).injector().invoke(function($rootScope) { 
  var a = performance.now(); 
  $rootScope.$apply(); 
  console.log(performance.now()-a); 
})

Kết quả sẽ cung cấp cho bạn khoảng thời gian của chu kỳ thông báo, tính bằng mili giây. Số càng nhỏ càng tốt.


GHI CHÚ:

Domi lưu ý trong các nhận xét: angular.element(document) sẽ không mang lại nhiều lợi ích nếu bạn sử dụng ng-appchỉ thị để khởi tạo. Trong trường hợp đó, hãy lấy ng-appphần tử thay thế. Vd: bằng cách làmangular.element('#ng-app')

Bạn cũng có thể thử:

angular.element(document.querySelector('[ng-app]')).injector().invoke(function($rootScope) { 
  var a = performance.now(); 
  $rootScope.$apply(); 
  console.log(performance.now()-a); 
})

Không có gì thay đổi trong trường hợp này, vì vậy không có người theo dõi nào chạy, không có gì được đánh giá lại, v.v. Bạn không nhận được số "thực".
một oliver tốt hơn

2
Tất nhiên chúng là những con số "thật". Bạn không chính xác, đang thực hiện $ rootScope. $ Apply () đánh giá lại tất cả những người theo dõi của bạn để tìm xem họ có thay đổi hay không (nếu không thì làm sao góc biết rằng không có gì thay đổi?).
Gil Birman

Có lẽ chúng ta có nghĩa là một cái gì đó khác nhau, vì vậy tôi chỉ trích dẫn các tài liệu: The listener is called only when the value from the current watchExpression and the previous call to watchExpression are not equal. Mã của bạn không tính đến bất kỳ người nghe nào. Và góc cạnh tạo ra rất nhiều người nghe. Bạn sẽ không bao giờ gọi điện $apply()khi không có gì thay đổi, do đó kết quả của bạn chỉ nói lên một nửa câu chuyện. Tùy theo hoàn cảnh nó có thể là một ít thú vị;)
một tốt hơn oliver

1
Hãy tưởng tượng điều này: bạn có 1000 biểu thức xem, tất cả chúng sẽ được đánh giá, nhưng kết quả là một "người nghe" sẽ kích hoạt. Bạn quan tâm hơn đến hiệu suất biểu cảm của chiếc đồng hồ hay người nghe?
Gil Birman

1
angular.element(document)sẽ không mang lại nhiều hiệu quả nếu bạn đã sử dụng ng-appchỉ thị để khởi tạo. Trong trường hợp đó, hãy lấy ng-appphần tử thay thế. Ví dụ như bằng cách làm angular.element('#ng-app')...
Domi


14

Bạn cũng có thể sử dụng hiệu suất góc

Tiện ích mở rộng này cung cấp các biểu đồ theo dõi thời gian thực về số lượng người theo dõi, thời gian thông báo và tỷ lệ thông báo. Bạn cũng nhận được phân phối thời gian thông báo để bạn có thể tạo ra thời gian thông báo đặc biệt dài từ nhiều paterns đệ quy hơn và tất cả dữ liệu thời gian thực được liên kết với các sự kiện để bạn có thể xác định hành động nào đã thay đổi hiệu suất ứng dụng. Cuối cùng, bạn có thể tính thời gian của phương thức dịch vụ và đếm thời gian thực thi của chúng để xác định phương thức có tác động nhiều hơn đến thời gian chạy ứng dụng của bạn.

Ảnh chụp màn hình hiệu suất góc

Disclamer: Tôi là tác giả của phần mở rộng


Tôi đã cài đặt nó, nhưng chưa tìm ra cách sử dụng nó. Tiện ích của bạn đã thêm các chức năng vào hồ sơ của Chrome chưa? Cảm ơn.
gm2008

Khi bạn mở các công cụ dành cho nhà phát triển, bạn sẽ có một tab "Angular" với chế độ xem đó trên đó.
Nicolas Joseph

Cảm ơn đã trả lời. Để tạo thành công tiện ích mở rộng, tôi cũng cần cài đặt Python, VCBuild.exe, Windows SDK. Có lẽ bạn có thể thêm vào sổ tay của mình.
gm2008

Tôi đang sử dụng Mac OsX nên tôi không biết những gì cần thiết cho Windows. Có thể bạn có thể thực hiện một yêu cầu kéo trên repo để mô tả những gì bạn đã làm. Cảm ơn bạn về thông tin !
Nicolas Joseph

"Chức năng định thời" làm gì? Tôi đã nhập một số tên mô-đun nhưng dường như không có gì xảy ra.
raoel

5

Bạn có thể tìm thấy một công cụ hữu ích để theo dõi chu trình thông báo thông qua công cụ ng-stats tuyệt vời của @kentcdodds . Nó tạo ra một yếu tố hình ảnh nhỏ như vậy, và thậm chí có thể được thực hiện thông qua bookmarklet. Nó thậm chí có thể được sử dụng bên trong iFrames như jsfiddle.

chu kỳ tiêu hóa tốt nhập mô tả hình ảnh ở đây

Tiện ích nhỏ để hiển thị số liệu thống kê về thông báo / đồng hồ góc cạnh trên trang của bạn. Thư viện này hiện có một tập lệnh đơn giản để tạo biểu đồ (xem bên dưới). Nó cũng tạo ra một mô-đun được gọi là angularStatscó một chỉ thị được gọi là chỉ thị angular-stats có thể được sử dụng để đặt các số liệu thống kê về góc vào một vị trí cụ thể trên trang mà bạn chỉ định.

Tìm thấy tại https://github.com/kentcdodds/ng-stats


2

Bạn có thể sử dụng UX Profiler

  • Chế độ xem Giao dịch người dùng, tức là NHẤP VÀ tất cả hoạt động do nó gây ra (các sự kiện khác, XHR, Hết giờ) được nhóm lại với nhau.
  • Các phép đo thời gian (theo cảm nhận của Người dùng) của toàn bộ Giao dịch người dùng và / hoặc các phần của nó.
  • Dấu vết ngăn xếp không đồng bộ kết hợp.
  • Hồ sơ tiêu điểm - hồ sơ chỉ sự kiện có vấn đề.
  • Tích hợp Angular 1.x.

nhập mô tả hình ảnh ở đây


1

đối với chế độ nghiêm ngặt, một lần chạy cucle thông báo, hãy chạy nó trong bảng điều khiển f12 trong chrome

angular.element(document).injector().invoke(['$rootScope',function($rootScope) { var a = performance.now(); $rootScope.$apply(); return performance.now()-a; }])

0

các công cụ ở trên mô tả đã cung cấp cho bạn ý tưởng về việc đo lường hiệu suất của vòng lặp thông báo Các điểm quan trọng nhất để tăng hiệu suất của chu kỳ thông báo là

  • Giám sát chặt chẽ các sự kiện cuộn để ẩn tất cả các yếu tố vô hình và
    giảm đáng kể số lượng người theo dõi.

  • Có chu kỳ thông báo $ có thể quản lý cho tất cả các sự kiện khác.

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.