Prestazioni delle funzioni anonime - setTimeout

4

Secondo Gregory Baker & Erik Arvidsson (Google), creando una funzione con nome e passando di essa a setTimeout è in realtà più veloce della creazione di una funzione anonima (riferimento: Ottimizzazione del codice JavaScript - > Evitare le insidie con le chiusure ):

Creating a closure is significantly slower then creating an inner function without a closure, and much slower than reusing a static function. For example:

<snip>

    function alertMsg() {
      var msg = 'Message to alert';
      alert(msg);
    }

is slower than:

    function setupAlertTimeout() {
      window.setTimeout(alertMsg, 100);
    }

Nei miei test, non sembra esserci alcuna differenza significativa ( jsPerf qui ), quindi perché affermano che la creazione una funzione con nome intero è più veloce di una semplice funzione anonima?

EDIT: nota che mi riferisco in modo specifico agli ultimi due esempi, il primo è stato rimosso per maggiore chiarezza.

    
posta Qantas 94 Heavy 28.03.2013 - 10:35
fonte

3 risposte

4

La differenza teorica deriva dal fatto che la funzione denominata nel tuo esempio viene creata in fase di "compilazione".

Ma la verità è che i motori JavaScript sono ora molto bravi a creare e gestire funzioni e ambiti, che è probabilmente uno degli argomenti più critici con lo stile di codifica di oggi, quindi il sovraccarico è in genere del tutto insignificante.

A mio parere, questo particolare consiglio crea più danno (codice troppo ottimizzato) che buono oggi. Lo vedo come obsoleto.

    
risposta data 28.03.2013 - 10:49
fonte
7

La differenza in Chrome, FF, IE10:

UserAgent           closure     nonclosure  static       # Tests 
Chrome 25.0.1364    55,885,835  86,105,613  587,742,003  1
Firefox 19.0        31,856,561  67,442,015  863,300,987  1
IE 10.0             10,430,542  18,945,667  485,135,189  1

In IE10 e Firefox, la modalità di non chiusura viene eseguita due volte più velocemente e in Chrome quasi il doppio della velocità. Il riferimento a una funzione statica è un ordine di grandezza più veloce di entrambi.

closure è definito come chiamando createClosure() :

function createClosure() {
    var a = 'hi';
    return function() {
        alert(a);
    };
}

nonclosure è definito come chiamando createNonClosure() :

function createNonClosure() {
    return function() {
        alert('hi');
    };
}

static fa semplicemente riferimento a una funzione statica, non importa se è denominato o meno.

Sono anche abbastanza sicuro che closure diventi più lento quando l'ambiente che viene chiuso diventa più grande.

Ecco il jsperf link

    
risposta data 28.03.2013 - 13:44
fonte
1

C'è una differenza significativa nelle prestazioni tra i tuoi esempi, ma a causa della velocità degli attuali parser JavaScript, la differenza non è evidente a meno che tu non stia effettuando la chiamata milioni di volte.

Pertanto, questa tecnica sarebbe considerata una micro-ottimizzazione, proprio come la tecnica delle variabili di scoping per ridurre le ricerche di catene prototipo. Potrebbe non fare la differenza se lo fai 10 volte nei tuoi gestori di eventi jQuery, ma farà una differenza significativa e importante nello sviluppo di motori di rendering JavaScript o quando si eseguono operazioni costose su sistemi con CPU limitata.

Controlla il test jsperf aggiornato al link .

    
risposta data 21.05.2013 - 23:44
fonte

Leggi altre domande sui tag