Angular 2 Performance:绑定数据成员比绑定函数更好吗?

Posted

技术标签:

【中文标题】Angular 2 Performance:绑定数据成员比绑定函数更好吗?【英文标题】:Angular 2 Performance: Is it better to bind with a data member than a function? 【发布时间】:2018-04-04 18:52:54 【问题描述】:

我想知道绑定到数据成员是否比绑定到函数在性能上更好?

例如下面哪个语句的性能会更好?

1)

<myComp *ngIf="isThisTrue"></mycomp>

isThisTrue 是通过方法设置的

checkIfTrue(data)
       this.isThisTrue = data;

在从 observable 接收事件时调用此 checkfTrue()。

2)

<mycomp *ngIf="seeIfItHasBecomeTrue()"></mycomp>

seeIfItHasBecomeTrue 检查 this.isTrue 是否变为真。

我明显觉得绑定到数据成员应该更快,但我不确定这是否总是更快?或者是否有一些灰色区域?还有,如果快的话要多少?

【问题讨论】:

尝试将 console.log 放入 seeIfItHasBecomeTrue - 我怀疑它会被调用 5 到 30 次。如果它是一个简单的函数,那没关系,但如果它更复杂,它可以变成可测量的东西。 my answer 有什么不清楚的地方吗? 抱歉耽搁了。感谢您的回答。你能帮我解答完整的问题吗?我一直在寻找,如果它总是更快,它有多快。 @TypeScripter,是的,它总是会更快,我在回答中解释了原因。速度有多快取决于您运行代码的特定机器 【参考方案1】:

如果您使用*ngIf="isThisTrue" 方法,编译器将生成以下updateRenderer 函数:

function (_ck, _v) 
    var _co = _v.component;
    var currVal_1 = _co.isThisTrue;   <--- simple member access
    _ck(_v, 5, 0, currVal_1);

如果你使用第二种方法*ngIf="seeIfItHasBecomeTrue()",函数将如下所示:

function(_ck,_v) 
    var _co = _v.component;
    var currVal_1 = _co.seeIfItHasBecomeTrue();   <--- function call
    _ck(_v,5,0,currVal_1);

并且函数调用比简单的成员访问更重性能。

要了解有关updateRenderer 函数的更多信息,请阅读:

The mechanics of DOM updates in Angular

【讨论】:

链接似乎已损坏。 您仍然可以在 Internet Archive web.archive.org/web/20191114183316/https://…987654322@上看到该文章

以上是关于Angular 2 Performance:绑定数据成员比绑定函数更好吗?的主要内容,如果未能解决你的问题,请参考以下文章

typescript Angular - Ng For TrackBy for Performance

绑定到函数时如何触发角度变化检测?

Angular JS 缩放和性能

angular入门篇(2)——*ngIf,数据绑定事件,属性绑定

绑定中的 Angular 2 绑定。事件内插值

将数据传递给另一个组件[重复]