2011-05-27 10 views

risposta

13

Il grosso problema è almeno duplice:

1) Accesso gli argomenti oggetto deve creare un oggetto arguments. In particolare, i moderni motori JS non creano effettivamente un nuovo oggetto per gli argomenti ogni volta che si chiama una funzione. Passano gli argomenti in pila, o anche nei registri macchina. Non appena tocchi arguments, però, devono creare un oggetto reale. Questo non è necessariamente economico.

2) Una volta toccato l'oggetto arguments, varie ottimizzazioni che i motori JS possono altrimenti eseguire (ad esempio, rilevare casi in cui non si assegna mai un argomento e ottimizzare tale caso comune) escono dalla finestra. Ogni accesso agli argomenti della funzione, non solo a quelli attraverso arguments diventa molto più lento perché il motore deve gestire il fatto che si potrebbe aver incasinato gli argomenti tramite arguments.

+0

Buona spiegazione: ho pensato che fosse qualcosa del genere. –

+0

Wow, sono davvero impressionato da questa eccellente risposta. Hai mai lavorato su un motore JS? –

+0

@ Boris Zbarsky. è vero che se facciamo cose di sola lettura come get arguments.length allora il sovraccarico sta semplicemente creando un nuovo oggetto argomenti e le varie ottimizzazioni non saranno influenzate? – Pacerier

0

Non ho mai sentito una spiegazione seria del motivo per cui l'accesso agli argomenti oggetto è costoso. Tuttavia, questo sito: http://www.playmycode.com/blog/2011/03/simple-yet-effective-javascript-optimisations/ nota che gli argomenti non sono in realtà un array ed è meno efficiente dell'accesso a un array. Il sito collegato sopra suggerisce anche la conversione di argomenti in un array come ottimizzazione.

Andando a verificare con chi ne sa interpreti JS più intimamente ...

+0

In ES5, * argomenti * è un oggetto Argomenti con proprietà chiaramente definite (ES5 §10.6). – RobG

Problemi correlati