如何衡量 AngularJS 应用程序摘要循环的性能?

测量 angularjs 消化周期持续时间的简单方法是什么?有各种各样的方法来分析消化循环的性能,但是每种方法都有自己的缺陷:

  • Chrome Profiler: 太多的细节,没有以一种简单易找的方式打破摘要循环
  • Batarang (AngularJS 浏览器插件) : 开销太大,刷新速度慢,大型应用程序爆炸。

一定有更好的办法?

52497 次浏览

The following answer will tell you the idle performance of the $digest loop, ie., the performance of digest when none of your watch expressions change. This is helpful if your application seems sluggish even when the view isn't changing. For more complex situations, see aet's answer.


Type the following into the console:

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

The result will give you the duration of the digest cycle, in milliseconds. The smaller the number, the better.


NOTE:

Domi noted in the comments: angular.element(document) will not yield much if you used the ng-app directive for initialization. In that case, get the ng-app element instead. E.g. by doing angular.element('#ng-app')

You can also try:

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

Here's a secret. In the chrome dev tools, do a cpu profile run. After you have stopped capturing, at the bottom of the screen is a down triangle next to "Heavy (Bottom Up)". Click the triangle and select "Flame Chart". Once you are in Flame Chart mode, you can zoom and pan to see the digest cycles, how long they take, and exactly what functions are being called. The Flame Chart is so incredibly useful for tracking down page load issues, ng-repeat performance problems, digest cycle problems! I really don't know how I was able to debug and profile before the Flame Chart. Here is an example:

Flame Chart in Chrome dev tools

Here is a new tool I found that helps out in digest profiling: Digest-HUD

enter image description here

You could also use angular-performance

This extension provides realtime monitoring charts of the number of watchers, digest timing and digest rate. You also get the digest timing distribution so that you can make out exceptionally long digest timing from more recursive paterns and all realtime data are linked to events so that you can determine which actions changed the application performances. Finally, you can time services method and count their execution to determine the ones that have the more impact on the running time of your app.

Angular performance screenshot

Disclamer: I am the author of the extension

You can use UX Profiler

  • User Transaction view, i.e. CLICK and all the activity caused by it (other events, XHRs, Timeouts) grouped together.
  • Time measurements (as User feels it) of the entire User Transaction and/or its parts.
  • Combined asynchronous stack trace.
  • Focused Profiler - profile just the problematic event.
  • Angular 1.x integration.

enter image description here

the tools above describe already gave you the idea of measuring the performance of digest loop Most importants points for increasing the performance of digest cycle are

  • Monitor closely scroll events to hide all invisible elements and
    greatly reduce the number of watchers.

  • Have manageable $digest cycles for all other events.

for strict mode, one running of digest cucle, run it in f12 console in chrome

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

One handy tool for keeping an eye on the digest cycle can be found via the excellent ng-stats tool by @kentcdodds. It creates a little visual element like so, and can even be implemented via bookmarklet. It can even be used inside of iFrames like jsfiddle.

good digest cycle enter image description here

Little utility to show stats about your page's angular digest/watches. This library currently has a simple script to produce a chart (see below). It also creates a module called angularStats which has a directive called angular-stats which can be used to put angular stats on a specific place on the page that you specify.

Found at https://github.com/kentcdodds/ng-stats