【问题标题】:What is the performance of checking an attribute vs checking a return value of a function?检查属性与检查函数的返回值的性能是什么?
【发布时间】:2019-06-29 08:15:12
【问题描述】:

我有一个组件中的项目列表:

list: Array<MyType>;

用户可以在点击时选择和取消选择元素:

toggleItem(item: MyType) {
  if (this.selection.has(item)) {
    this.selection.delete(item);
    return;
  }

  this.selection.add(item);
}

所选项目存储在Set

selected: Set<MyType> = new Set();

现在我需要切换一个 CSS 类和一个 title-attribute,这取决于一个元素是否被选中:

<button class="toggle"
        type="button"
        [ngClass]="{'selected': selection.has(item)}"
        [title]="selection.has(item) ? 'Select' : 'Deselect'"
        (click)="toggleItem(item)">
  {{ item.title }}
</button>

现在我在某处读到,评估函数调用是一个坏主意,因为 Angular 会定期调用它们进行更改检测,如下所示:

[ngClass]="{'selected': selection.has(item)}"

他们说最好检查变量或对象的成员,例如:

[ngClass]="{'selected': item.selected}"

这是真的,它是否会降低我目前使用它的方式的性能?我是否应该为在 Set 中添加或删除时设置的每个项目添加一个属性?

【问题讨论】:

  • 运行基准测试时会发生什么?

标签: javascript angular typescript performance angular8


【解决方案1】:

每当 Angular 执行更改检测时,它都会检查模板中的任何变量是否发生了更改。

现在,对于模型变量的检查非常简单,因为 Angular 可以简单地读取它们的值以检查更改。

但函数并非如此。对于函数,Angular 只能通过调用函数本身来判断变量是否发生了变化。

现在,如果该函数是一个值的单行返回,则没有太大区别。

但是如果函数有复杂的逻辑,它基本上会扼杀所有的性能。每次更改检测周期运行时,Angular 都会调用该函数以检查并检测更改。

因此,不建议在模板中使用数据绑定语法编写函数。

注意:我还为此写了Medium Article。我建议你检查一下。它主要是关于 Angular Reactive Forms 的性能。但它会帮助你更好地理解我上面所说的。

【讨论】:

  • 感谢您的回答。这就说得通了。还要感谢您提供对事物进行更深入解释的链接。所以总的来说,这取决于,像 `Set.has()´ 之类的简单内部函数或布尔值的简单返回都可以,但应该避免一切更复杂的事情。
  • 是的。但同样,如果您可以使用类属性,请尽量保持您的 Component 类,减少函数的污染。
猜你喜欢
  • 2021-11-26
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
相关资源
最近更新 更多