2017-03-21 14 views
2

スクリプトのロード段階で、多くのプロパティがObject.defineProperty、Object.definePropertiesまたはObject.createを使用して定義されている場合。また、ほとんどの記述子は書き込み不能(アクセサーでない場合)、構成不可能、列挙不可能または組み合わせのいずれかです。通常の割り当てやオブジェクトの初期化と比較して、パッシブなパフォーマンスの違いは何か、ターゲットのプロパティへのアクセスのパフォーマンスの違いは何ですか?Object.definePropertyの呼び出し後/実行時のパフォーマンスへの影響

書込み禁止や設定不可能なプロパティの定義には、書込みを防ぐためのガードの設定や再定義がパフォーマンスの低下の原因の1つになると聞いていますが、これは本当ですか?

定義例:

Object.defineProperty(window, 'foo', { 
    configurable: false, 
    enumerable: false, 
    writable: false, 
    value: 10 
}); 
+0

私はベンチマークでしか分かりません。 – Bergi

+0

@Bergiしかし、JITが複雑な最適化などを行っているため、パフォーマンスがコンテキストに大きく左右されるため、JavaScriptで少し面倒なことを考えるとベンチマークはしません。 – monad

+0

はい。 'defineProperty'はこれらの最適化に影響を与えます。パフォーマンスについて議論するときには無視できません。 – Bergi

答えて

1

がObject.defineProperty/DefinePropertiesメソッドとプロパティを作成するには、間違いなく単なるそれらを割り当てるよりも遅くなります。ベンチマークと関連性を持たせる最も良い方法は、実際の生産コードの異なるバージョンを測定するのが理想的です。実際の生産コードのさまざまなバージョンを測定することが理想的です。

プロパティの読み取り方法は、プロパティの定義方法に関係なく同じ速度です。

既存のプロパティへの書き込みは、foo.bar = bazが使用されたか、Object.defineProperty(foo, "bar", {value: baz})が使用されたかを知ることができないため、常に書き込み可能かどうかをチェックする必要があります。それでは同じスピードです。

特別なガードはありません。

+0

メソッドを使用してプロパティを作成する方法については、https://www.nczonline.net/blog/2015/11/performance-implication-object-defineproperty/を読んでいますが、答えの後半部分は不明です。あなたが正しいと仮定してプロパティがどのように動作するかを本当に明らかにしました。ありがとう! – monad

関連する問題