ng-csp 指令的性能影响
Performance impact of ng-csp directive
启用内容安全策略并添加 ng-csp 指令可防止 Angular 使用 Function()
和 eval()
进行某些优化。
文档指出性能最多可降低 30%。
我想知道使用 ng-csp 指令实际上会影响哪些 angular 功能。
是否有变通方法、模式或其他想法可以降低使用该指令的成本?
我做了一些研究,了解性能影响的最简单方法是查看 2012 年在 AngularJs 中引入 CSP 支持的 initial commit (see issue on Github too)。
问题是你需要使用像
这样的(子)表达式的解析
a.b.c.d.e
例如
user.data.books
在 HTML 模板文件中的 Angular 表达式中。 Angular 最初使用的解析器 new Function(arguments, code) to parse these expressions. However, to support CSP you can't use new Function()
or eval()
. The magic number 30% seems to come from http://jsperf.com/angularjs-parse-getter/4 (source)。我对结果的解释是,带有 for
循环的代码(即汇编中的跳转)比带有 inlined/expanded for
循环的代码慢。
根据前面的段落,我认为您无法采取任何有意义的措施来减轻性能损失。也许(如果你绝望的话)只是不要使用长表达式(如 a.b.c.d.e.f.g.h
)并使用相当短的表达式,但我认为这不是优化代码的可行方法。
快进到 2015 年,AngularJs 代码库发生了重大变化,但您可以看到有 two parsers:ASTInterpreter
(对于启用 CSP)和 ASTCompiler
(对于 CSP禁用)。也许您可以在这些解析器中放入一些性能评估代码,以将 ASTInterpreter
与 ASTCompiler
进行比较。
HTH
启用内容安全策略并添加 ng-csp 指令可防止 Angular 使用 Function()
和 eval()
进行某些优化。
文档指出性能最多可降低 30%。
我想知道使用 ng-csp 指令实际上会影响哪些 angular 功能。
是否有变通方法、模式或其他想法可以降低使用该指令的成本?
我做了一些研究,了解性能影响的最简单方法是查看 2012 年在 AngularJs 中引入 CSP 支持的 initial commit (see issue on Github too)。
问题是你需要使用像
这样的(子)表达式的解析a.b.c.d.e
例如
user.data.books
在 HTML 模板文件中的 Angular 表达式中。 Angular 最初使用的解析器 new Function(arguments, code) to parse these expressions. However, to support CSP you can't use new Function()
or eval()
. The magic number 30% seems to come from http://jsperf.com/angularjs-parse-getter/4 (source)。我对结果的解释是,带有 for
循环的代码(即汇编中的跳转)比带有 inlined/expanded for
循环的代码慢。
根据前面的段落,我认为您无法采取任何有意义的措施来减轻性能损失。也许(如果你绝望的话)只是不要使用长表达式(如 a.b.c.d.e.f.g.h
)并使用相当短的表达式,但我认为这不是优化代码的可行方法。
快进到 2015 年,AngularJs 代码库发生了重大变化,但您可以看到有 two parsers:ASTInterpreter
(对于启用 CSP)和 ASTCompiler
(对于 CSP禁用)。也许您可以在这些解析器中放入一些性能评估代码,以将 ASTInterpreter
与 ASTCompiler
进行比较。
HTH