angular.equals() 占用了 50% 的执行时间

Posted

技术标签:

【中文标题】angular.equals() 占用了 50% 的执行时间【英文标题】:angular.equals() takes up 50% of execution time 【发布时间】:2017-06-19 08:50:35 【问题描述】:

正如大多数人在 AngularJS 职业生涯中所做的那样,我在我的应用程序中遇到了性能瓶颈,我一直在使用 Chrome 中的分析器来尝试找出原因。

顺便说一句;我已经完成了我认为对 AngularJS 应用程序的正常优化,并且我没有过多的观察者 [~300]。不过,我确实使用 Angular Google Maps 和 Angular Material。

分析器中出现的主要内容是 AngularJS 中一个名为 equals 的函数,它占用了 50% 的时间。有趣的是,虽然我没有在我的代码中使用angular.equals,所以我希望它有一些内部 Angular 过程(摘要循环?)或外部库 - 尽管我已经检查了我使用的大多数大型库中的源代码并且他们使用 @ 987654325@ 谨慎。

谁能给我一些提示,告诉我在哪里查看或查看什么类型的代码以找出导致这些过度相等检查的原因?

【问题讨论】:

【参考方案1】:

正如堆栈跟踪所示,equals() 正在从 $digest 递归调用,当它评估所有观察者时。

当您使用objectEquality 选项时,观察者将使用angular.equals(),如documentation 所示:

objectEquality == true 时,watchExpression 的不等式由angular.equals 函数确定。为了保存对象的值以供以后比较,使用了 angular.copy 函数。 因此,这意味着观看复杂的对象会对内存和性能产生不利影响。

所以我想说最简单的答案是要么使用更少的观察者,要么更谨慎地使用objectEquality 选项。

【讨论】:

我猜是关于检测变化的机制上的脏检查系统,不是吗? @LenilsondeCastro 这也可能是一个因素。我不是很精通 Angular 的内部结构,但你可以看到 $digest 是如何实现的 here。 感谢您的回答,我不知道objectEquality 选项如何影响性能。话虽如此,我很少使用实际的$scope.$watch,而当我这样做时,我不使用objectEquality。是$scope.$watch("expression", ...)还是$scope.$watch(()=> return $scope.value; , ...)更好 再考虑一下...如果我有一个 ng-if="vehicle == $ctrl.selectedVehicle" 的 AngularJS 绑定,它会在后台使用 angular.equals 还是只是比较引用? @Chris AFAIK 应该使用实际的 == 运算符而不是 angular.equals。而且我认为expression() => return $scope.value; 之间的性能应该不会有太大差异。不幸的是,我对 Angular 的内部工作原理了解得不够多,无法想到其他可能导致它在幕后使用 .equals() 的事情。

以上是关于angular.equals() 占用了 50% 的执行时间的主要内容,如果未能解决你的问题,请参考以下文章

NT kernel & system 占用了50%的CPU,太不正常了,请问这个问题怎么解决?

angular.equals() 是不是可以用作角度表达式?

电脑开机360提示:svchost.exe占用CPU超50%,结束进程后,导致不能上网

如何使用自动布局对子视图进行编程以占用其父视图宽度的 50% 但保持恒定高度?

使 flex-box 中的元素占用动态空间量(如果两个元素则为 50%,如果三个元素则为 33% 等)[重复]

打印机关闭后,CPU占用率达到50%以上,怎么办啊>.<