2012-12-28 10 views
8

Recentemente ho giocato un po 'con l'ottimizzazione del codice javascript per creare giochi HTML5, indirizzando in particolare i browser mobili. Ho iniziato a confrontare i motori e ho gradualmente semplificato i codici confrontati e ho avuto qualcosa che non capisco.Perché la modifica della variabile globale aumenta l'utilizzo della memoria in Chrome

Il caso è che ho notato che in Chrome (quindi suppongo che tutti i browser basati sul webkit) modificando le variabili globali provoca un aumento della memoria utilizzata. Lasciate che vi mostri due esempi:

1) Modifica variabile globale:

Codice:

var globalVariable = 0; 

var fps = 60; 
window.onload = init; 

function init() { 
    setInterval (loop, 1000/fps); 
}; 


function loop(){ 

    for (var i = 0; i < 1000000; i++) { 
    globalVariable = Math.random(); 
    } 
}; 

schermo di memoria Timeline: Memory 1

Come si può vedere che ha un sacco di memoria da collezionare durante i primi 10 secondi!

2) Creazione variabile locale invece di modificare globale uno:

Il codice rimane lo stesso, l'unico cambiamento è l'aggiunta di parole chiave "var" all'interno del ciclo. globalVariable = Math.random(); diventa var localVariable = Math.random();

schermo di Timeline Memoria: Memory 2

Come si può vedere l'utilizzo della memoria è molto basso, per i primi 10 secondi aumenta solo circa 0,1MB.

La differenza è davvero enorme! Non sono in grado di controllarlo ora, ma sono stato informato che in Firefox in entrambi gli esempi l'utilizzo della memoria per entrambi i casi sembra quasi lo stesso.

Qualcuno può spiegarmi o indicarmi le risorse dove viene spiegato? O qualcuno può suggerirmi come modificare la variabile globale per non aumentare la memoria utilizzata?

+0

Questi sono i link alle demo, non sono stato in grado di postarli nel post originale a causa della limitazione di due link per i nuovi utenti. https://dl.dropbox.com/u/54987642/LocalAndGlobalTest/modifyingGlobalVar.html https://dl.dropbox.com/u/54987642/LocalAndGlobalTest/modifyingLocalVar.html – Jorasso

+0

Molto interessante: si potrebbe pensare la differenza sarebbe il contrario! La mia teoria è che cercare fuori dal circuito per la variabile globale sta causando un maggiore utilizzo della memoria invece di crearlo all'interno dello stesso ambito. Proprio come il caching della lunghezza dell'array prima di usarlo in un ciclo for ha lo stesso effetto positivo. – 0x499602D2

+0

Non sarei sorpreso se chrome fosse in grado di determinare che non si fa nulla con la variabile locale ed è in grado di saltare completamente il codice, ma nel caso delle variabili globali sarebbe più difficile dire se qualcuno sta usando esso. –

risposta

2

(prima, un rapido sproloquio sulle variabili 'globali'. Non ci sono le variabili globali in Javascript, ci sono ambiti, tra cui un ambito a livello di finestra)

Ma, la risposta è che l'accesso a una variabile di un altro scope in una funzione in Javascript lo inserisce nell'attuale scope. Here's a fun explanation of the effect.

+0

Quindi, la variabile viene copiata in qualche modo, il che comporta l'utilizzo della memoria? –

+0

La variabile non viene copiata: viene creato un ambito con la variabile al suo interno. – tmcw

Problemi correlati