2012-12-28 3 views
8

最近、モバイルブラウザを対象としたHTML5ゲームを作成するためのJavaScriptコードの最適化を少し行いました。私はエンジンの比較を始め、徐々に比較コードを単純化しました。私は理解できないことがあります。なぜグローバル変数を変更するとChromeでのメモリ使用量が増えるのですか

大文字小文字が区別されているのは、グローバル変数を変更するChrome(すべてのWebkitベースのブラウザがそうだと思いますので)で使用されているメモリが増えていることに気づいています。私はあなたに2つの例をお見せしましょう:

1)グローバル変数を変更:

コード:メモリー・タイムラインの

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

が画面:Memory 1

あなたはそれをたくさん持って見ることができるように最初の10秒間に収集するメモリの量!

2)ローカル変数を作成する代わりにグローバルな変更:

コードのみ変更がループ内でキーワード「VAR」を追加して、同じままです。 globalVariable = Math.random(); var localVariable = Math.random();になります。メモリのタイムラインの

画面:Memory 2

あなたはメモリの使用量は、それだけで0.1メガバイト程度増加最初の10秒間、本当に低いです見ることができるように。

違いは本当に大きいです!私は今それを確認することができませんが、私は両方の例のFirefoxのメモリ使用量はほぼ同じに見えることが通知された。

誰でも私を説明したり、説明されているリソースを教えてもらえますか?または誰も私に使用されたメモリを増加させないようにグローバル変数を変更する方法を私に提案することができますか?

+0

ここにデモへのリンクがあります。新しいユーザーには2つのリンクの制限があるため、元の投稿に投稿できませんでした。 https://dl.dropbox.com/u/54987642/LocalAndGlobalTest/modifyingGlobalVar.html https://dl.dropbox.com/u/54987642/LocalAndGlobalTest/modifyingLocalVar.html – Jorasso

+0

非常に興味深い:あなたが思うだろう違いはまったく違うでしょう!私の理論は、グローバル変数のループ外を見ることは、同じスコープ内で作成するのではなく、より多くのメモリ使用量を引き起こすことです。 forループで使用する前に配列の長さをキャッシュする方法と同じように、同じ効果があります。 – 0x499602D2

+0

クロムは、あなたがローカル変数で何もしないことを決定でき、コードを完全にスキップすることができればそれほど驚きはありませんが、グローバル変数のケースでは、誰かが使用しているかどうかを知ることは難しくなりますそれ。 –

答えて

2

(最初に、「グローバル」変数に関する簡単な暴言。JavaScriptでグローバルな変数が存在しない、ウィンドウレベルのスコープを含むスコープが存在する)

しかし、答えは別の変数にアクセスすることですスコープをJavascriptの関数で現在のスコープに巻き上げます。 Here's a fun explanation of the effect.

+0

ですから、変数は何らかの形でコピーされます。その結果、メモリが使用されますか? –

+0

変数はコピーされません。スコープは変数を使って作成されます。 – tmcw

関連する問題