1

在最近开发AngularJS应用程序时,我遇到了与手表有关的性能问题,进一步深入挖掘让我想知道使用双向数据绑定的脏检查算法的时间复杂度是多少?从它的外观来看,每一个事件之后都有一个消化循环,这个循环称为一个观察循环,所以这必须是O(n^2)...这是正确的吗?AngularJS的脏检查算法的时间复杂度是多少?

回答

1

脏检查发生在$diggest周期中,所以我们需要研究$diggest周期的复杂性。

$diggest周期是Angular确保模型更改已经解决的阶段,以便它可以使用更新的更改呈现视图。为此,Angular开始一个循环,其中每次迭代评估视图的所有模板表达式 以及$scope$watcher函数。 如果在当前的迭代中结果与前一个相同,则 然后Angular将退出循环。否则,它会再试一次。 如果经过10次尝试仍未解决,Angular将退出 ,并显示错误:"Infite $diggest Loop Error" (infdig)

因此,脏检查的复杂性会降低您在$watcher和您的视图表达式(如$filter s)中所具有的功能的复杂性。

因此,$diggest单独的复杂度为O(n),其中n是需要迭代的数字和模板表达式。但是,那么你将不得不考虑这些功能的复杂性。此外,请注意,周期将始终访问所有这些功能至少两次(为了确保更改已经解决),所以如果您想要更加精确,可以说它的复杂度至少为O(n*2),并且最大复杂度为O(n*10),但由于2是最大数量为10的常数值,所以复杂度仍应被视为O(n)