2016-06-27 29 views
3

我對Angular 1.x有性能問題。使用函數表達式和過濾器來獲取基於鍵的值是否有任何性能優勢?讓我用例子來解釋。角度性能 - 過濾器與函數表達式

我目前有一個複雜的角度應用程序,有許多過濾器用於獲取基於對象鍵的值。我的數據中有很多鍵/ ID引用,所以我使用過濾器來獲取基於鍵的字段值。

E.g. {{ ID123 | getField:'object':'field'}} 

的自定義過濾器,然後將做一個異步調用(以DB),以獲得我基於關鍵(ID123)指定對象名稱,並返回我指定(而不是僅僅顯示鍵)領域。

我目前正在做一些性能清理的過程,並且我已經閱讀了很多有關避免過濾器的內容,因爲它們在性能上很受歡迎。我正在做的一件事是使用一次性綁定{{::ID123 | getField:'object':'field'}},但在某些情況下我不能這樣做(因爲我需要更新值)。

然後我在查看函數表達式而不是自定義過濾器,例如{{getField(ID123,'object','field')}}.但我不確定它是否會獲得任何性能優勢。

你可以看到我比較兩者的plunker例子。

https://plnkr.co/edit/hlL2LSOGjq5HsImUyqyu?p=preview

會不會有任何性能優勢?還有沒有辦法測試或基準兩者之間的差異?

由於

+0

「有沒有辦法測試b將兩者區別開來......「關於如何做到這一點有很多問題,包括[Stack Overflow上的這一個](http://stackoverflow.com/q/27396539/215552)。關於哪些性能優勢?由於您在每次調用過濾器或函數時都會進行異步調用,因此我猜測過濾器或函數不是您的瓶頸;這是異步調用。您應該考慮重構您的查詢,以便信息一次全部出現。 –

+0

確保您瞭解摘要循環的工作方式。許多摘要可以在每個週期完成。讓異步調用每個摘要效率都不高 – charlietfl

+0

我緩存異步調用,因此每個摘要循環都會檢查緩存,並且只在沒有緩存時才進行異步調用。至於性能,我更擔心過濾器引起的摘要調用次數。有些頁面有20-30個這些過濾器。所以在消化循環期間,他們都被調用。這些函數是否也在每個摘要循環中被調用? –

回答

2

短的答案:被提供更好濾波器是冪等的(即,相同的輸入總是返回相同的輸出)且輸入是不是對象。


龍回答

如果您使用的功能,它會在每個週期中消化所謂的,因爲角度必須檢查輸出是一樣的。這意味着它將在顯示的數據「解決」之前被調用多次。

如果使用過濾器和輸入不是一個對象,它只會如果輸入已經改變執行,因爲角度假設,除非他們的$stateful屬性設置爲true濾網是冪等。 對象是一個例外,因爲檢查對象的深層屬性是否更改很昂貴,所以Angular在每個摘要循環中執行過濾器,使其與函數相同。

小心創建的自定義過濾器是而不是 idempotent,Angular會認爲它們是並且不會正確更新顯示的數據。如果您必須創建一個,請將它們標記爲$stateful


來源

這個問題是在正確的方向有關,我指出:
Custom filter vs filter function in controller performance comparison

這就是「當過濾器執行」和過濾器的角文檔(節「狀態過濾器」):
https://docs.angularjs.org/guide/filter