啓用內容安全策略並添加ng-csp指令可防止Angular使用Function()
和eval()
進行某些優化。ng-csp指令的性能影響
該文件指出,性能可以降低高達30%。
我想知道使用ng-csp指令實際上會影響哪些角度特徵。
是否有解決方法,模式或其他想法可以降低使用該指令的成本?
啓用內容安全策略並添加ng-csp指令可防止Angular使用Function()
和eval()
進行某些優化。ng-csp指令的性能影響
該文件指出,性能可以降低高達30%。
我想知道使用ng-csp指令實際上會影響哪些角度特徵。
是否有解決方法,模式或其他想法可以降低使用該指令的成本?
我做了一些研究和了解性能命中最簡單的方法是看initial commit(see issue on Github too)在AngularJs在2012年
的事情是,你需要使用的分辨率推出CSP支持回(子)表達式,如
a.b.c.d.e
eg
user.data.books
您的HTML模板文件中的角度表達式。對此的角度解析器最初使用new Function(arguments, code)來解析這些表達式。但是,要支持CSP,您不能使用new Function()
或eval()
。幻數30%似乎來自http://jsperf.com/angularjs-parse-getter/4(source)。我對結果的解釋是,具有for
循環的代碼(即程序集中的跳轉)比具有內嵌/擴展for
循環的代碼慢。
根據前面的段落,我不認爲有什麼有意義的事情可以減輕性能影響。也許(如果你絕望)只是不要使用長表達式(如a.b.c.d.e.f.g.h
)並使用較短的表達式,但我認爲這不是一種優化代碼的可行方法。
快進到2015年,AngularJs代碼庫發生重大變化,但你可以看到有two parsers:ASTInterpreter
(啓用了CSP)和ASTCompiler
(CSP爲禁用)。也許你可以在這些解析器中添加一些性能評估代碼,將ASTInterpreter
與ASTCompiler
進行比較。
HTH
謝謝馬丁。這非常有用 – HipsterZipster 2015-12-23 16:20:44
你也許可以通過緩存路徑,或使淺別名深路徑減少查找(亦即。'a.x = a.b.c.d.e.x')。 – dandavis 2015-12-18 04:02:26