Как я могу измерить производительность моего цикла DigiSQL?

Что такое простой способ измерения продолжительности цикла digularjs digest? Существуют различные методы анализа производительности цикла дайджеста, однако каждый из них имеет свои собственные погрешности:

  • Профилировщик Chrome: слишком много деталей, не разбивает цикл дайджеста в удобном для поиска манере
  • Batarang (плагин для браузера AngularJS): слишком много накладных расходов, медленная частота обновления, взрывается большими приложениями.

... должен быть лучший способ?! 1?

Ответ 1

Вот секрет. В инструментах chrome dev выполните прогон профиля cpu. После того, как вы остановили захват, внизу экрана находится треугольник вниз рядом с "Heavy (Bottom Up)". Нажмите треугольник и выберите "Пламя диаграммы". Когда вы находитесь в режиме пламенной графики, вы можете масштабировать и панорамировать, чтобы увидеть циклы дайджеста, сколько времени они берут и точно какие функции вызывают. Пламенная диаграмма настолько невероятно полезна для отслеживания проблем с загрузкой страницы, проблем с ошибками ng-repeat, проблем с циклами дайджеста! Я действительно не знаю, как мне удалось отладить и профилировать перед пламенной таблицей. Вот пример:

Flame Chart in Chrome dev tools

Ответ 2

В следующем ответе будет указано idle производительность цикла $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); 
})

Ответ 3

Вот новый инструмент, который я нашел, который помогает в профилировании дайджеста: Digest-HUD

enter image description here

Ответ 4

Вы также можете использовать angular-performance

Это расширение предоставляет диаграммы мониторинга в реальном времени количества наблюдателей, времени переваривания и скорости переваривания. Вы также получаете дайджест распределение времени, так что вы можете сделать исключительно длинный дайджест время от более рекурсивных отцов и все данные в реальном времени связаны с событий, чтобы вы могли определить, какие действия изменили приложение выступления. Наконец, вы можете использовать метод времени и подсчитать их чтобы определить те, которые оказывают большее влияние на время работы вашего приложения.

Angular performance screenshot

Disclamer: Я являюсь автором расширения

Ответ 5

Один удобный инструмент для наблюдения за циклом дайджеста можно найти через отличный инструмент ng-stats @kentcdodds. Он создает небольшой визуальный элемент, подобный этому, и может быть даже реализован через букмарклет. Его можно даже использовать внутри iFrames, например jsfiddle.

правильный цикл дайджеста введите описание изображения здесь

Небольшая утилита для отображения статистики о вашей странице angular digest/watches. Эта библиотека в настоящее время имеет простой script для создать диаграмму (см. ниже). Он также создает модуль под названием angularStats, который имеет директиву под названием angular-statsкоторый можно использовать для размещения статистики angular в определенном месте на указанной странице.

Найдено на https://github.com/kentcdodds/ng-stats

Ответ 6

Вы можете использовать UX Profiler

  • Просмотр пользовательской транзакции, т.е. CLICK и все действия, вызванные им (другие события, XHR, таймауты), сгруппированные вместе.
  • Измерения времени (как чувствует пользователь) всей транзакции пользователя и/или ее частей.
  • Комбинированная асинхронная трассировка стека.
  • Focused Profiler - профиль только проблемного события.
  • Angular интеграция 1.x.

введите описание изображения здесь

Ответ 7

описанные выше инструменты уже дали вам представление об измерении производительности цикла дайджеста  Большинство факторов, влияющих на повышение производительности цикла дайджест, составляют

  • Следить за темой прокрутки событий, чтобы скрыть все невидимые элементы и
     значительно уменьшить количество наблюдателей.

  • Имеют управляемые циклы дайджеста $для всех других событий.

Ответ 8

для строгого режима, один запуск дайджест-cucle, запуск его в консоли f12 в chrome

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