1

Как и большинство людей в карьере AngularJS, я ударил шею для бутылки производительности в своем приложении, и я использовал профилировщик в Chrome, чтобы попытаться выяснить Зачем.angular.equals() занимает 50% времени выполнения

Как раз в сторону; Я сделал то, что я считаю обычной оптимизацией для приложений AngularJS, и у меня нет чрезмерных наблюдателей [~ 300]. Тем не менее, я использую Angular Google Maps и Angular Material.

Главное, что появляется в профилировщике, - это функция, называемая equals внутри AngularJS, которая занимает 50% времени. Интересно, хотя я не использую angular.equals в своем коде, поэтому я ожидаю его некоторого внутреннего углового процесса (цикл digest?) Или внешней библиотеки - хотя я проверил исходный код в большинстве больших библиотек, которые я использую, и они экономно используют .equals().

Может ли кто-нибудь дать мне несколько подсказок относительно того, где искать или какой тип кода искать, чтобы выяснить, что вызывает эти чрезмерные проверки на равенство?

enter image description here

ответ

4

Как трассировки стека показывает, equals() настоящее время рекурсивно вызывается из $digest, когда он оценивает все ваши наблюдателей.

Watchers будет использовать angular.equals(), когда вы использовали опцию objectEquality, как указано в documentation:

Когда objectEquality == true, неравенство watchExpression определяется в соответствии с функцией angular.equals. Чтобы сохранить значение объекта для последующего сравнения, используется функция угловой.copy. Это означает, что просмотр сложных объектов будет иметь неблагоприятные последствия для памяти и производительности.

Так что я бы сказал, самый простой ответ или использовать меньше наблюдателей или использовать опцию objectEquality более экономно.

+0

Я думаю, что речь идет о грязной системе проверки механизма обнаружения изменений, не так ли? –

+0

@LenilsondeCastro Это также может быть фактором. Я не настолько хорошо разбираюсь в внутренних функциях Angular, но вы можете увидеть, как реализуется '$ digest' [здесь] (https://github.com/angular/angular.js/blob/03043839d5a540b02208001fe12e812dfde00a8e/src/ng/rootScope. JS). – JLRishe

+0

Спасибо за ответ, я не знал, как параметр 'objectEquality' влияет на производительность. Сказав, что я использую очень мало фактических '$ scope. $ Watch', и когда я это делаю, я не использую' objectEquality'. Лучше делать '$ scope. $ Watch (" expression ", ...)' или '$ scope. $ Watch (() => {return $ scope.value;}, ...)' – Chris