Як мені виміряти ефективність дайджест-циклу моєї програми AngularJS?


82

Який простий спосіб виміряти тривалість циклу перебору angularjs? Існують різні методи аналізу результатів циклу перетравлення, однак кожен має свої власні помилки:

  • Chrome Profiler: Забагато деталей, не розбиває цикл дайджесту так легко
  • Batarang (плагін браузера AngularJS): Забагато накладних витрат, повільна частота оновлення, вибухає з великими програмами.

... повинен бути кращий спосіб?! 1?

Відповіді:


148

Ось секрет. В інструментах chrome dev виконайте запуск профілю процесора. Після того, як ви зупинили зйомку, внизу екрана знаходиться трикутник вниз поруч із написом "Важкий (знизу вгору)". Клацніть трикутником і виберіть "Диаграма полум'я". Після того, як ви перейдете в режим діаграми полум'я, ви зможете масштабувати та панорамувати, щоб побачити дайджест-цикли, скільки часу вони займають і які саме функції викликаються. Діаграма полум’я надзвичайно корисна для відстеження проблем із завантаженням сторінок, проблем продуктивності ng-repeat, проблем циклу перетравлення! Я насправді не знаю, як мені вдалося налагодити та створити профіль до діаграми полум'я. Ось приклад:

Діаграма полум’я в розробницьких інструментах Chrome


10
Дякую. Просто спробував, і це видається дуже корисним. Чи можете ви опублікувати коротке демонстраційне відео про те, як ви можете використовувати його на сайті для виявлення та виправлення проблеми з продуктивністю? Було б дуже цікаво. Знову дякую.
Soferio

3
Здається, це просто називають "діаграмою" і виглядає дещо інакше в поточній (v. 51.0) версії Chrome.
Марк Стобер

Google випустив докладний підручник з короткими відео: developers.google.com/web/tools/chrome-devtools/…
Вайден,

41

Наступна відповідь повідомить вам про бездіяльність циклу $ digest, тобто про ефективність дайджесту, коли жоден з виразів годин не зміниться. Це корисно, якщо ваша програма здається млявою, навіть коли вигляд не змінюється. Більш складні ситуації див. У відповіді aet.


Введіть у консоль наступне:

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

Результат дасть вам тривалість циклу перетравлення в мілісекундах. Чим менше число, тим краще.


ПРИМІТКА:

Домі зазначив у коментарях: 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); 
})

У цьому випадку нічого не змінюється, тому жоден спостерігач не працює, ніщо не переоцінюється тощо. Ви не отримуєте "реальних" цифр.
кращий олівер

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. Ваш код не враховує жодного слухача. А angular створює безліч слухачів. Ви ніколи не зателефонуєте, $apply()коли нічого не змінилося, отже, ваші результати розповідають лише половину історії. Залежно від обставин він може бути менш цікавим;)
кращий Олівер

1
Уявіть собі: у вас є 1000 годинникових виразів, всі вони будуть оцінені, але один "слухач" у результаті спрацює. Вас більше турбує виконання годинникової експресії чи слухачів?
Гіл Бірман,

1
angular.element(document)не дасть багато, якщо ви використовували ng-appдирективу для ініціалізації. У такому випадку отримайте ng-appзамість цього елемент. Наприклад, роблячи angular.element('#ng-app')...
Домі

21

Ось новий інструмент, який я знайшов, що допомагає у складенні профілів дайджестів: Digest-HUD

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


Ось форк без згаданої
mtfurlan

Будь ласка, відкрийте PR для оригінального репо, я був би радий об'єднати це!
Piotr

14

Ви також можете використовувати кутову продуктивність

Це розширення надає графіки моніторингу в реальному часі кількості спостерігачів, термінів дайджесту та швидкості дайджесту. Ви також отримуєте дайджест розподілу часу, щоб ви могли розібрати надзвичайно довгий час дайджесту з більш рекурсивних шаблонів, а всі дані в реальному часі пов'язані з подіями, щоб ви могли визначити, які дії змінили ефективність програми. Нарешті, ви можете визначити час службових методів та підрахувати їх виконання, щоб визначити ті, які мають більший вплив на час роботи вашого додатка.

Скріншот кутової продуктивності

Відмова: Я автор розширення


Я встановив його, але не з’ясував, як ним користуватися. Ваше розширення додало функції до профайлера Chrome? Дякую.
gm2008

Коли ви відкриваєте інструменти розробника, у вас повинна бути вкладка "Angular" із таким видом.
Ніколас Джозеф

Дякую за відповідь. Щоб успішно побудувати розширення, мені потрібно також встановити Python, VCBuild.exe, Windows SDK. Можливо, ви можете додати до свого посібника.
gm2008,

Я працюю під Mac OsX, тому я не маю уявлення про те, що потрібно для Windows. Можливо, ви можете зробити запит на витяг на репо, щоб описати, що ви зробили. Дякую за інформацію!
Ніколя Джозеф

що робить "Хронометраж функцій"? Я ввів деякі імена модулів, але, здається, нічого не сталося.
Раоель,

5

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

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

Невелика утиліта для показу статистичних даних про кутовий дайджест / годинник вашої сторінки. Наразі ця бібліотека має простий сценарій для створення діаграми (див. Нижче). Він також створює модуль, angularStatsякий називається директивою, angular-stats яка може використовуватися для розміщення кутової статистики у певному місці сторінки, яке ви вказали.

Знайдено за адресою https://github.com/kentcdodds/ng-stats


2

Ви можете використовувати UX Profiler

  • Представлення користувацьких транзакцій, тобто КЛІК, та всі дії, спричинені цим (інші події, XHR, тайм-аути), згруповані разом.
  • Вимірювання часу (як це відчуває Користувач) усієї транзакції користувача та / або її частин.
  • Комбінована асинхронна трасування стека.
  • Фокусований Профайлер - профіль лише проблемної події.
  • Кутова інтеграція 1.x.

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


1

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

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

0

інструменти, описані вище, вже дали вам ідею вимірювання продуктивності циклу дайджесту.

  • Ретельно стежте за подіями прокрутки, щоб приховати всі невидимі елементи та
    значно зменшити кількість спостерігачів.

  • Майте керовані $ дайджест цикли для всіх інших подій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.