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 costruttoreFunction
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?
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
Non inviare funzioni da AJAX, inviare dati. Definisci le tue funzioni in _.js_ o '
Penso che quello che stanno dicendo è che se si utilizza il costruttore funzione nel codice come questo:
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.
fonte
2013-05-08 01:37:58
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:
compilazionePiù 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.fonte
2013-05-08 01:48:48
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. –
@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 '
Problemi correlati