ChromeのデベロッパーツールでJavaScript のメモリ使用量を調べる
prototype プロパティでメモリを節約する においてprototype プロパティを使うとメモリ使用量が少なくてすみますというエントリを書いたのだが、どのくらいのメモリが節約できるのかについては言及していなかった。
推測するな、計測せよ(Don’t guess, measure!)の原則のもとChromeのデベロッパーツールを使用してメモリ使用量を計測してみた。
なお、Chromeのデベロッパーツールでメモリを計測するのには以下を参考にした。
今回は[Record Allocation Profiler] という、JavaScript 関数ごとのメモリ割り当てを表示してくれるプロファイルを使用した。
サンプルプログラム
100000個のインスタンスを生成するプログラム。
連番で変数をつくる方法がeval
くらいしか思いつかなかった。
コンストラクタでメソッドを追加版
function Something (any) { this.any = any; // インスタンスを生成する数だけメモリ領域を確保する this.doSomething = function () { console.log("I do " + this.any); } } for (var i = 0; i < 100000; i++) { eval("var something" + i + " = new Something('nothing')"); eval("something" + i + ".doSomething()"); // I do nothing } console.log('finished.')
prototype プロパティにメソッドを追加版
function Something (any) { this.any = any; } // __proto__ プロパティを参照するためインスタンス数に依存しない Something.prototype.doSomething = function() { console.log("I do " + this.any); } for (var i = 0; i < 100000; i++) { eval("var something" + i + " = new Something('nothing')"); eval("something" + i + ".doSomething()"); // I do nothing } console.log('finished.')
結果発表
コンストラクタでメソッドを追加
メモリ使用量: 37.6MB
prototype プロパティにメソッドを追加
メモリ使用量: 31.5MB
Something()のメモリ使用量がコンストラクタ版では6.5MB、prototype プロパティ版では16.4KBと400倍違った。
きれいにこの差がメモリ使用量の差となっており、prototype プロパティにメソッドを追加するほうがメモリ使用量は少なくなるという結果になった。
めでたしめでたし。