Javascript 角度性能-滤波器与函数表达式

Javascript 角度性能-滤波器与函数表达式,javascript,angularjs,performance,angular-filters,Javascript,Angularjs,Performance,Angular Filters,我有一个关于Angular 1.x的性能问题。使用函数表达式与过滤器来获取基于键的值是否有任何性能优势?让我举例说明 我目前有一个复杂的angular应用程序,其中有许多过滤器用于获取基于对象键的值。我的数据中有很多键/ID引用,所以我使用过滤器来获取基于键的字段值 E.g. {{ ID123 | getField:'object':'field'}} 然后,自定义过滤器将执行一个异步调用(对DB),以获取我基于键(ID123)指定的对象名,并返回我指定的字段(而不仅仅是显示键) 我目前正在做

我有一个关于Angular 1.x的性能问题。使用函数表达式与过滤器来获取基于键的值是否有任何性能优势?让我举例说明

我目前有一个复杂的angular应用程序,其中有许多过滤器用于获取基于对象键的值。我的数据中有很多键/ID引用,所以我使用过滤器来获取基于键的字段值

E.g. {{ ID123 | getField:'object':'field'}}
然后,自定义过滤器将执行一个异步调用(对DB),以获取我基于键(ID123)指定的对象名,并返回我指定的字段(而不仅仅是显示键)

我目前正在做一些性能清理,我读了很多关于避免使用过滤器的书,因为它们会影响性能。我正在做的一件事是使用一次性绑定
{{::ID123 | getField:'object':'field'}}
,但在某些情况下我不能这样做(因为我需要更新值)

然后我看的是函数表达式而不是自定义过滤器,例如,
{{getField(ID123,'object','field')}。
,但我不确定它是否会获得任何性能好处

您可以看到我的plunker示例,其中我比较了两者

会有任何性能优势吗?还有没有办法测试或基准测试两者之间的差异


谢谢

简短回答:如果过滤器是幂等的(即,相同的输入总是返回相同的输出),并且输入不是对象,则过滤器会更好


长答案

如果使用函数,它将在每个摘要循环中调用,因为Angular必须检查输出是否相同。这意味着在显示的数据“稳定”之前,它将被调用多次

如果使用筛选器,且输入不是对象,则仅当输入已更改时才会执行,因为Angular假定筛选器是幂等的,除非其
$stateful
属性设置为
true
。 对象是一个例外,因为检查对象的深层属性是否更改的代价很高,所以Angular在每个摘要周期中执行过滤器,使其与函数相同

要小心创建不是幂等的自定义过滤器,Angular将假定它们是幂等的,并且不会正确更新显示的数据。如果必须创建一个,请将它们标记为
$stateful


来源

这个问题是相关的,为我指明了正确的方向:

这是过滤器的角度文档(部分“何时执行过滤器”和“有状态过滤器”):

“有没有办法测试两者之间的差异”。。。关于如何做到这一点,有很多问题,包括。关于性能优势有哪些?由于您对过滤器或函数的每次调用都进行异步调用,我猜过滤器或函数不是您的瓶颈;这是异步调用。你应该重新构造你的查询,以便信息一次全部出现。确保你了解摘要周期是如何工作的。在每个循环中可以进行许多消化。进行异步调用每个摘要在所有缓存异步调用时都是无效的,因此每个摘要循环都会检查缓存,并且仅在没有缓存的情况下进行异步调用。至于性能,我更担心过滤器导致的摘要调用的数量。有些页面有20-30个这样的过滤器。因此,在消化周期中,它们都被调用。函数是否也在每个摘要循环中被调用?因此我在过滤器和函数上添加了一个计数。看起来函数被调用的次数几乎是过滤器的10倍。