在最近开发AngularJS应用程序时,我遇到了与手表有关的性能问题,进一步挖掘让我想知道使用双向数据绑定的脏检查算法的时间复杂度是多少?从它的外观来看,在每个事件之后都有一个摘要周期,它会调用一个监视周期,所以这必须是O(n ^ 2)......这是正确的吗?
答案 0 :(得分:1)
脏检查发生在$diggest
周期中,因此我们需要研究$diggest
周期的复杂性。
$diggest
周期是Angular确保模型更改已解决的阶段,
这样它就可以使用更新的更改呈现视图。为了做到这一点,
Angular启动一个循环,其中每次迭代都会计算所有模板表达式
视图,以及$watcher
的{{1}}函数。
如果在当前迭代中结果与前一个结果相同,
然后Angular将退出循环。否则,它会再试一次。
如果在10次尝试之后事情还没有解决,Angular将退出
错误:"Infite $diggest Loop Error" (infdig
)。
因此,脏检查的复杂性将取决于$scope
和视图表达式(如$watcher
s)中函数的复杂性。
因此$filter
周期的复杂性为$diggest
,其中O(n)
是数字n
和需要迭代的模板表达式。但是你必须考虑这些功能的复杂性。另外,请注意$watcher
周期将始终至少访问所有这些函数两次(以确保更改已经确定),因此如果您想要更精确,可以说它具有复杂性至少$diggest
且最大复杂度为O(n*2)
,但由于2是一个常数值,其最大数量为10,因此仍应将复杂性视为O(n*10)
。