[解決済み] JavaScriptのオブジェクトを「ロックダウン」することによるパフォーマンス上の利点は?
質問
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
関連
-
[解決済み] 2つのJavaScriptオブジェクトのプロパティを動的にマージするにはどうすればよいですか?
-
[解決済み] JavaScriptのオブジェクトの配列からidでオブジェクトを検索する
-
[解決済み] オブジェクトをメンバーとして、プレーンなJavaScriptオブジェクトをループさせる方法
-
[解決済み] 2つのJavaScriptオブジェクトの等質性を判断する方法は?
-
[解決済み] JavaScript の連想配列からオブジェクトを削除するにはどうすればよいですか?
-
[解決済み] JavaScript のネストしたオブジェクトや配列に文字列パスでアクセスする
-
[解決済み] JavaScriptオブジェクトのコンストラクタ
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] AngularJS - ngRepeatフィルタリングされた結果の参照を取得する方法
-
[解決済み] JavaScriptでjson-objectのキーを取得する [重複].
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] フリーズとシールの違い
-
[解決済み] Javascriptによるタッチスクリーンデバイスの検出
-
[解決済み] なぜJavaScriptでは!{}[true]がtrueに評価されるのですか?
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] 文字列がhtmlであるかどうかをチェックする
-
[解決済み] javascript includes() 大文字小文字を区別しない
-
[解決済み] Reactメモを使うべきではない場合とは?
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?