12

Włączenie zasady ochrony treści i dodanie dyrektywy ng-csp zapobiega używaniu przez Angulara wartości Function() i eval() w celu uzyskania pewnej optymalizacji.Wpływ na wydajność dyrektywy ng-csp

Dokument stwierdza, że ​​wydajność może spaść nawet o 30%.

Zastanawiam się, na jakie akcenty kątowe rzeczywiście ma wpływ dyrektywa ng-csp.

Czy istnieją rozwiązania, wzorce lub inne pomysły, które mogą obniżyć koszty korzystania z tej dyrektywy?

+0

prawdopodobnie można zmniejszyć wyszukiwań poprzez buforowanie ścieżek lub dokonywania płytkie aliasów do głębokich ścieżek (np. 'A.x = a.b.c.d.e.x'). – dandavis

Odpowiedz

5

Zrobiłem rozeznanie i najprostszym sposobem, aby zrozumieć spadek wydajności jest patrząc na initial commit (see issue on Github too), która wprowadziła obsługę CSP w angularjs z powrotem w 2012

Chodzi o to, że trzeba użyć uchwał Wyrażenia (pod) takie jak

a.b.c.d.e 

np.

w wyrażeniach kątowych w plikach szablonów HTML. Angular parser dla tego używał pierwotnie new Function(arguments, code) do parsowania tych wyrażeń. Jednak w celu obsługi CSP nie można używać new Function() ani eval(). Magiczna liczba 30% wydaje się pochodzić z http://jsperf.com/angularjs-parse-getter/4 (source). Moja interpretacja wyników jest taka, że ​​kod z pętlą for (tj. Przeskakuje w złożeniu) jest wolniejszy niż kod z wbudowaną/rozwiniętą pętlą for.

W świetle poprzednich punktów, nie uważam, że jest coś znaczącego, co można zrobić, aby złagodzić skutki działania. Może (jeśli jesteś zdesperowany) po prostu nie używaj długich wyrażeń (np. a.b.c.d.e.f.g.h) i używaj raczej krótkich, ale nie sądzę, że jest to optymalny sposób na zoptymalizowanie kodu.

przodu do 2015, angularjs CODEBASE znacznej zmianie, ale widać nie są two parsers: ASTInterpreter (dla włączony CSP) i ASTCompiler (CSP dla niepełnosprawnych). Być może możesz umieścić kod wydajności w tych parserach, aby porównać ASTInterpreter z ASTCompiler.

HTH

+1

Dzięki Martin. To jest naprawdę przydatne – HipsterZipster