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


82

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

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

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

답변:


148

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

Chrome 개발 도구의 Flame Chart


10
감사. 그냥 시도했는데 매우 유용 해 보입니다. 성능 문제를 감지하고 복구하기 위해 사이트에서 사용하는 방법에 대한 짧은 데모 비디오를 게시 할 수 있습니까? 매우 흥미로울 것입니다. 다시 한 번 감사드립니다.
Soferio

3
이것은 단지 "차트"라고 불리는 것으로 보이며 현재 (v. 51.0) Chrome 버전에서는 약간 다르게 보입니다.
Marc Stober

Google은 짧은 동영상이 포함 된 자세한 자습서를 출시했습니다. developers.google.com/web/tools/chrome-devtools/…
Vaiden

41

다음 답변은 $ 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); 
})

이 경우 아무 것도 변경되지 않으므로 감시자가 실행되지 않고 재평가되지 않습니다. "실제"숫자를 얻지 못합니다.
a better oliver

2
물론 그들은 "실제"숫자입니다. 당신은 틀 렸습니다. $ rootScope. $ apply ()를 수행하면 모든 감시자가 변경되었는지 확인하기 위해 모든 감시자가 다시 평가됩니다 (그렇지 않으면 angular가 변경된 사항이 없음을 어떻게 알 수 있습니까?).
Gil Birman

아마도 우리는 다른 것을 의미 할 수 있으므로 문서를 인용합니다 : The listener is called only when the value from the current watchExpression and the previous call to watchExpression are not equal. 코드는 리스너를 고려하지 않습니다. 그리고 각도는 많은 청취자를 만듭니다. $apply()아무것도 변경 되지 않았을 때 전화를 걸지 않기 때문에 결과는 이야기의 절반에 불과합니다. ) 상황에 따라이 덜 흥미로운 일이 될 수 있습니다
더 나은 올리버

1
이를 상상해보십시오. 1000 개의 watch 표현식이 있고 모두 평가되지만 결과적으로 하나의 "listener"가 실행됩니다. 시계 표현 성능이나 청취자에 대해 더 걱정하고 있습니까?
Gil Birman 2014

1
angular.element(document)ng-app초기화를 위해 지시문을 사용하면 많은 것을 얻지 못합니다 . 이 경우 ng-app대신 요소를 가져 오십시오 . 예를 들어 angular.element('#ng-app')...
Domi


14

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

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

각도 성능 스크린 샷

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


설치했지만 사용 방법을 찾지 못했습니다. 확장 프로그램이 Chrome의 프로파일 러에 기능을 추가 했습니까? 감사.
gm2008

개발자 도구를 열면 해당보기가있는 "Angular"탭이 있어야합니다.
Nicolas Joseph

답변 감사합니다. 확장을 성공적으로 빌드하려면 Python, VCBuild.exe, Windows SDK도 설치해야합니다. 매뉴얼에 추가 할 수도 있습니다.
gm2008

저는 Mac OsX를 사용하고 있으므로 Windows에 필요한 것이 무엇인지 모릅니다. 아마도 당신이 한 일을 설명하기 위해 repo에서 pull request를 할 수 있습니다. 정보에 대해서 감사드립니다 !
Nicolas Joseph

"기능 타이밍"은 무엇을합니까? 일부 모듈 이름을 입력했지만 아무 일도 일어나지 않는 것 같습니다.
raoel

5

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

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

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

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


2

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

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

여기에 이미지 설명 입력


1

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

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

0

위에서 설명한 도구는 다이제스트 루프의 성능을 측정하는 아이디어를 이미 제공했습니다. 다이제스트 사이클의 성능을 높이기위한 가장 중요한 포인트는 다음과 같습니다.

  • 스크롤 이벤트를 자세히 모니터링하여 보이지 않는 모든 요소를 ​​숨기고
    관찰자 수를 크게 줄입니다.

  • 다른 모든 이벤트에 대해 관리 가능한 $ digest주기를 갖습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.