[performance] AngularJS 앱의 다이제스트 사이클 성능을 어떻게 측정합니까?

angularjs 다이제스트주기의 기간을 측정하는 간단한 방법은 무엇입니까? 다이제스트주기의 성능을 분석하는 다양한 방법이 있지만 각각 고유 한 핏팔이 있습니다.

  • Chrome Profiler : 세부 정보가 너무 많고 쉽게 찾을 수있는 방식으로 다이제스트주기를 분해하지 않습니다.
  • Batarang (AngularJS 브라우저 플러그인) : 오버 헤드가 너무 많고 새로 고침 속도가 느리고 대형 앱이 폭발합니다.

… 더 나은 방법이 있어야합니다?! 1?



답변

여기에 비밀이 있습니다. 크롬 개발 도구에서 cpu 프로필 실행을 수행합니다. 캡처를 중지하면 화면 하단에 “Heavy (Bottom Up)”옆에 아래쪽 삼각형이 있습니다. 삼각형을 클릭하고 “불꽃 차트”를 선택하십시오. Flame Chart 모드에 있으면 확대 / 축소 및 이동하여 다이제스트주기, 소요 시간 및 정확히 어떤 함수가 호출되는지 확인할 수 있습니다. Flame Chart는 페이지로드 문제, ng-repeat 성능 문제, 다이제스트주기 문제를 추적하는 데 매우 유용합니다! Flame Chart 이전에 어떻게 디버깅하고 프로파일 링 할 수 있었는지 정말 모르겠습니다. 예를 들면 다음과 같습니다.

Chrome 개발 도구의 Flame Chart


답변

다음 답변은 $ digest 루프 의 유휴 성능, 즉 시계 표현식이 변경되지 않을 때의 다이제스트 성능을 알려줍니다. 보기가 변경되지 않는 경우에도 애플리케이션이 느리게 보이는 경우 유용합니다. 더 복잡한 상황은 aet의 답변을 참조하십시오.


콘솔에 다음을 입력하십시오.

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

결과는 다이제스트주기의 기간을 밀리 초 단위로 제공합니다. 숫자가 작을수록 좋습니다.


노트:

Domi는 주석에서 다음과 같이 언급했습니다
. 초기화를 angular.element(document)위해 ng-app지시문을 사용하면 많은 결과를 얻지 못합니다 . 이 경우 ng-app대신 요소를 가져 오십시오 . 예를 들어angular.element('#ng-app')

다음을 시도 할 수도 있습니다.

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


답변

다음은 다이제스트 프로파일 링에 도움이되는 새로운 도구입니다. Digest-HUD

여기에 이미지 설명 입력


답변

각도 성능을 사용할 수도 있습니다.

이 확장은 감시자 수, 다이제스트 타이밍 및 다이제스트 속도에 대한 실시간 모니터링 차트를 제공합니다. 또한 다이제스트 타이밍 분포를 가져 와서 더 많은 재귀 패턴에서 예외적으로 긴 다이제스트 타이밍을 확인할 수 있으며 모든 실시간 데이터가 이벤트에 연결되어 어떤 작업이 애플리케이션 성능을 변경했는지 확인할 수 있습니다. 마지막으로 서비스 메서드의 시간을 측정하고 실행 횟수를 계산하여 앱의 실행 시간에 더 많은 영향을 미치는 서비스를 결정할 수 있습니다.

각도 성능 스크린 샷

Disclamer : 나는 확장의 저자입니다.


답변

다이제스트주기에 눈을 유지하기위한 하나의 편리한 도구는 우수한 통해 찾을 수 있습니다 NG-통계 툴 에 의해 @kentcdodds . 이와 같이 약간의 시각적 요소를 생성하고 북마크릿을 통해 구현할 수도 있습니다. jsfiddle과 같은 iFrame 내부에서도 사용할 수 있습니다.

좋은 다이제스트주기 여기에 이미지 설명 입력

페이지의 각도 다이제스트 / 시계에 대한 통계를 표시하는 유틸리티가 거의 없습니다. 이 라이브러리에는 현재 차트를 생성하는 간단한 스크립트가 있습니다 (아래 참조). 또한
지정한 페이지의 특정 위치에 각도 통계를 배치하는 데 사용할 수있는 angularStats라는 지시문이있는 라는 모듈을 생성합니다 angular-stats.

https://github.com/kentcdodds/ng-stats 에서 찾을 수 있습니다.


답변

UX 프로파일 러를 사용할 수 있습니다.

  • 사용자 트랜잭션보기, 즉 CLICK 및 이로 인해 발생한 모든 활동 (기타 이벤트, XHR, 시간 초과)이 함께 그룹화됩니다.
  • 전체 사용자 트랜잭션 및 / 또는 그 부분의 시간 측정 (사용자가 느끼는대로).
  • 결합 된 비동기 스택 추적.
  • Focused Profiler-문제가있는 이벤트 만 프로파일 링합니다.
  • Angular 1.x 통합.

여기에 이미지 설명 입력


답변

엄격 모드의 경우 다이제스트 큐클을 실행하고 크롬의 f12 콘솔에서 실행합니다.

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