2012-12-28 20 views
8

Niedawno grałem trochę z optymalizacją kodu javascript, aby tworzyć gry HTML5, kierując się przede wszystkim na przeglądarki mobilne. Zacząłem od porównywania silników i stopniowo upraszczałem porównywane kody, a do czegoś nie rozumiałem.Dlaczego modyfikowanie globalnej zmiennej zwiększa wykorzystanie pamięci w Chrome?

Przypadek jest taki, że zauważyłem, że w Chrome (więc domyślam się, że wszystkie przeglądarki oparte na webkitach) modyfikowanie globalnej zmiennej powoduje zwiększenie używanej pamięci. Pokażę wam dwa przykłady:

1) Modyfikacja globalnej zmiennej:

Kod:

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(); 
    } 
}; 

Ekran osi czasu Pamięć: Memory 1

Jak widać to ma wiele pamięci do zebrania w ciągu pierwszych 10 sekund!

2) Tworzenie zmiennej lokalnej zamiast modyfikowania globalnej:

Kod pozostaje taka sama, jedyną zmianą jest dodanie słowa kluczowego „var” w pętli. globalVariable = Math.random(); staje się var localVariable = Math.random();

Ekran Timeline pamięci: Memory 2

Jak widać zużycie pamięci jest bardzo niski, w ciągu pierwszych 10 sekund po prostu zwiększa około 0,1MB.

Różnica jest naprawdę ogromna! Nie jestem w stanie tego sprawdzić teraz, ale poinformowano mnie, że w Firefoksie w obu przykładach użycie pamięci dla obu przypadków wygląda prawie tak samo.

Czy ktoś może mi wyjaśnić, lub wskazać mi zasoby, w których jest wyjaśnione? Lub czy ktoś może zaproponować mi, jak zmodyfikować zmienną globalną, aby nie zwiększać używanej pamięci?

+0

Oto linki do demonstracji, nie mogłem opublikować ich w oryginalnym poście z powodu dwóch ograniczeń linków dla nowych użytkowników. https://dl.dropbox.com/u/54987642/LocalAndGlobalTest/modifyingGlobalVar.html https://dl.dropbox.com/u/54987642/LocalAndGlobalTest/modifyingLocalVar.html – Jorasso

+0

Bardzo interesujący: wy mieliście myśleć różnica byłaby odwrotna! Moja teoria mówi, że szukanie poza pętlą dla zmiennej globalnej powoduje większe zużycie pamięci, niż tworzenie jej wewnątrz tego samego zakresu. Podobnie jak buforowanie długości tablicy przed jej użyciem w pętli for ma taki sam pozytywny efekt. – 0x499602D2

+0

Nie byłbym zaskoczony, gdyby chrome było w stanie ustalić, że nie robisz nic z lokalną zmienną i jest w stanie całkowicie pominąć kod, ale w przypadku zmiennej globalnej byłoby trudniej powiedzieć, czy ktoś używa to. –

Odpowiedz

2

(pierwszy, szybkie rant o zmiennych „globalny”. Nie ma zmiennych globalnych w JavaScript, istnieją zakresy, w tym zakres okno poziomu)

Ale odpowiedź jest, że dostęp do zmiennej z innego zakres w funkcji w Javascriptu podnosi go do bieżącego zakresu. Here's a fun explanation of the effect.

+0

Więc zmienna jest jakoś kopiowana, co powoduje zużycie pamięci? –

+0

Zmienna nie jest kopiowana - zakres jest tworzony z zawartą w nim zmienną. – tmcw

Powiązane problemy