2013-05-08 16 views
5

che sto caricando un file di script tramite la tecnologia AJAX, e per eseguire il suo contenuto che sto facendo questo:L'utilizzo di `nuova Function` e prestazioni emette

new Function('someargument',xhr.responseText)(somevalue); 

Tuttavia, secondo MDN:

Function Gli oggetti creati con il costruttore Function vengono analizzati quando viene creata la funzione. Questo è meno efficiente di dichiarare una funzione e chiamarla all'interno del codice, poiché le funzioni dichiarate con l'istruzione della funzione vengono analizzate con il resto del codice.

Davvero non capisco. Se una funzione è dichiarata, deve ancora essere analizzata dal formato di stringa del file, quindi perché eseguire una stringa caricata tramite new Function potrebbe essere meno efficace?

Questa è davvero una cosa più curiosa per me. Riesco a capire perché sarebbe un brutto giro (dovendo ri-analizzare la stessa stringa), ma per qualcosa del genere non penso che ci siano problemi, vero?

+2

Viene analizzato quasi come eval, che è noto per essere lento. Suppongo che * dovrebbe essere un po 'più veloce, in quanto non è necessario collegare la catena di portata. – bfavaretto

+0

Non inviare funzioni da AJAX, inviare dati. Definisci le tue funzioni in _.js_ o '

6

Penso che quello che stanno dicendo è che se si utilizza il costruttore funzione nel codice come questo:

new Function('bar', 'console.log(bar);')); 

Il corpo della funzione viene analizzato due volte: la prima volta come una stringa quando viene caricato il codice, e la seconda volta quando la funzione è costruita in fase di esecuzione. Nel tuo caso, stai creando la funzione da una risposta ajax dopo che il codice è stato analizzato, quindi è davvero un affare completamente diverso.

1

Non so quale sia l'autore di questo articolo MDN, ma qui c'è un'interpretazione.

Molti moderni interpreti JS utilizzano un compilatore ottimizzante per produrre codice nativo.

Ad esempio, "JavaScriptCore, the WebKit JS implementation" dice:

compilazione

In tal caso non è graduato tra le tre forme: analisi iniziale e compilazione produce bytecode, che può essere ottimizzata con il metodo JIT, che può essere ottimizzato dal DFG JIT. In pratica, però, sulla maggior parte delle piattaforme l'interprete non è incluso, in modo che tutto il codice passi attraverso il metodo JIT.

Più completa il quadro un compilatore ottimizzato ha del codice è la compilazione, più ottimizzazioni può eseguire, in modo più altamente ottimizzata la funzione può essere. Ad esempio, se si sa che ogni riferimento a una funzione viene usato per chiamarlo immediatamente con una stringa come unico argomento perché è definito in un corpo di funzione rigoroso, allora si potrebbe essere in grado di evitare di allocare un oggetto funzione per esso ed eseguire determinate ottimizzazioni nel suo corpo.

Quando si chiama new Function, il compilatore di ottimizzazione non ottiene il contesto necessario per eseguire tali e altre ottimizzazioni.

+0

Ok, quindi come si dovrebbe applicare alla mia situazione: il codice che utilizza 'new Function' è un preloader e il codice che viene analizzato è lo script vero e proprio per il gioco su cui sto lavorando. –

+1

@Kolink, si applica alla tua situazione? Hai un benchmark per vedere se ha un impatto sulle prestazioni? Non prendere decisioni sulle prestazioni senza dati quando i dati sono facili da raccogliere. Basta provare quello che hai, e l'equivalente usando un '