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
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