ho fatto qualche ricerca e il modo più semplice per capire il calo di prestazioni è di guardare il initial commit (see issue on Github too), che ha introdotto il supporto CSP in AngularJs nel 2012.
Il fatto è che è necessario utilizzare risoluzioni del (sotto) espressioni come
a.b.c.d.e
es.
user.data.books
in espressioni angolari nei file modello HTML. Parser angolare per questo usato originariamente new Function(arguments, code) per analizzare queste espressioni. Tuttavia, per supportare CSP non è possibile utilizzare new Function()
o eval()
. Il numero magico del 30% sembra provenire da http://jsperf.com/angularjs-parse-getter/4 (source). La mia interpretazione dei risultati è che il codice con un ciclo for
(ovvero i salti nell'assembly) è più lento del codice con un ciclo for
espanso/espanso.
Alla luce dei paragrafi precedenti, non credo che si possa fare qualcosa di significativo per mitigare l'impatto sul rendimento. Forse (se sei disperato) non usare le espressioni lunghe (come a.b.c.d.e.f.g.h
) e usare quelle piuttosto brevi, ma non penso che sia un modo fattibile per ottimizzare il tuo codice.
Fast forward al 2015, AngularJs codebase cambiato sostanzialmente, ma si può vedere ci sono two parsers: ASTInterpreter
(per CSP abilitato) e ASTCompiler
(per CSP disabilitato). Forse puoi mettere un po 'di codice di valutazione delle prestazioni in quei parser per confrontare ASTInterpreter
contro ASTCompiler
.
HTH
fonte
2015-12-16 22:34:52
si può probabilmente ridurre le ricerche mettendo in cache i percorsi, o fare alias poco profonde per i percorsi in profondità (ad es. 'A.x = a.b.c.d.e.x'). – dandavis