多个观察者对同一个值,性能如何?

时间:2013-09-10 17:25:15

标签: performance angularjs angularjs-scope

要点:

在AngularJs中,如果在多个地方使用相同的变量进行数据绑定,是否会导致每个$ digest-cycle对此变量进行多次脏检查?

更长的问题:

我想从模板中的范围打印变量,但应用程序对性能非常敏感。假设模板包含以下内容:

<div>{{variableInScope}}</div>
  <span class="{{variableInScope}}">We print {{variableInScope}} a lot!</span>
  <span class="{{variableInScope}}">We print {{variableInScope}} again!</span>
  ... snip ~100 lines ...
</div>

这会导致每个$ digest周期检查变量variableInScope一次还是200次?

“可怕的代码!为什么你不使用NG-repeat?”

上面的代码只是一个例子来说明这个问题。我正在构建一个数据网格,我不能使用NG-repeat,因为它设置了一个很多的观察者,导致客户计算机上的摘要时间超过2秒。

“只需使用ng-grid!”

NG网格在很多方面都很棒,但对于我们的用例,它有同样的问题:许多ng重复的方式,导致性能下降。我们确实需要将$ digest时间降至最低,因为页面其余部分的复杂性。

1 个答案:

答案 0 :(得分:2)

在您的示例中,这些100多行中的每一行都没有监视variableInScope。但是当值发生变化时,它将在每个实例中更新。如果那些是带有ngModel的输入字段,则会有所不同。观看可能比更新DOM更激烈,但大多数观察者都是将当前值与旧值进行简单比较。

就多个观察者而言,基于观察者的复杂性,性能成本是线性的,除非观察者将改变该值。在这种情况下,它必须再次运行所有的观察者。

这是一个演示,用于显示使用所有{{variableInScope}}调用观察者的所有时间。记录计数。您可以更改该值以查看计数更改。

http://jsfiddle.net/TheSharpieOne/VaeBJ/1/