1. ホーム
  2. javascript

[解決済み] JavaScriptのオブジェクトを「ロックダウン」することによるパフォーマンス上の利点は?

2023-05-14 15:50:29

質問

JavaScript 1.8.5 (ECMAScript 5) では、次のような興味深いメソッドが追加されました。 将来の改変を防ぐ を防ぐ興味深いメソッドが追加されました。

ある時点以降にオブジェクトを変更したくないことがわかっている場合、後で不用意に変更しようとするとエラーが発生するように、オブジェクトをロックすることができます。(ただし、あなたが "use strict"; を行っていればの話ですが)。

私の質問です。 V8のような最新のJSエンジンにおいて、上記の方法でオブジェクトをロックすることにパフォーマンス上の利点(例えば、より速いプロパティ検索、メモリフットプリントの削減)はあるのでしょうか?

(参照 John Resigの素晴らしい説明 - はパフォーマンスについては触れていませんが)。

どのように解決するのですか?

これまで 差がない は、少なくとも Chrome 47.0.2526.80 (64 ビット) 以降のパフォーマンスには差がありません。

Testing in Chrome 6.0.3359 on Mac OS 10.13.4
-----------------------------------------------
Test               Ops/sec
non-frozen object  106,825,468  ±1.08%  fastest
frozen object      106,176,323  ±1.04%  fastest

パフォーマンステスト(以下のサイトで入手可能) http://jsperf.com/performance-frozen-object ):

  const o1 = {a: 1};
  const o2 = {a: 1};

  Object.freeze(o2);

  // Non-frozen object:
  for(var key in o1);

  // Frozen object:
  for(var key in o2);

2019.10.30更新 : Chromeでの性能に差はありません 78.0.3904 (64ビット)

2019.09.17のアップデート : Chromeでの性能に差はありません 76.0.3809 (64ビット)

2018.05.03更新 : Chromeでの性能に差はありません 66.0.3359 (64ビット)

2017.03.06 更新 : Chromeでの性能に差はありません 56.0.2924 (64ビット)

2015.12.13 更新 : Chromeでの性能に差はありません 47.0.2526.80 (64ビット)


Chrome 34 では、@pimvdb のテストケースにおいて、凍結したオブジェクトは凍結していないオブジェクトよりもわずかに良好なパフォーマンスを示します (結果は以下のとおりです)。しかし、この差は、パフォーマンス上の利点のためにこのテクニックを使用することを正当化するほど大きくはないようです。

http://jsperf.com/performance-frozen-object

Testing in Chrome 34.0.1847.116 on OS X 10.9.2
----------------------------------------------
Test               Ops/sec
non-frozen object  105,250,353  ±0.41%  3% slower
frozen object      108,188,527  ±0.55%  fastest

kangaxのテストケースを実行すると、両方のバージョンのオブジェクトがほとんど同じように動作することがわかります。

http://jsperf.com/performance-frozen-object-prop-access

Testing in Chrome 34.0.1847.116 on OS X 10.9.2
----------------------------------------------
Test               Ops/sec
non-frozen object  832,133,923  ±0.26%  fastest
frozen object      832,501,726  ±0.28%  fastest

http://jsperf.com/http-jsperf-com-performance-frozen-object-instanceof

Testing in Chrome 34.0.1847.116 on OS X 10.9.2
----------------------------------------------
Test               Ops/sec
non-frozen object  378,464,917  ±0.42%  fastest
frozen object      378,705,082  ±0.24%  fastest