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

f:id:snowlong:20171227163345p:plain

prototype プロパティにメソッドを追加

メモリ使用量: 31.5MB

f:id:snowlong:20171227163349p:plain

Something()のメモリ使用量がコンストラクタ版では6.5MB、prototype プロパティ版では16.4KBと400倍違った。
きれいにこの差がメモリ使用量の差となっており、prototype プロパティにメソッドを追加するほうがメモリ使用量は少なくなるという結果になった。

めでたしめでたし。