2017-09-05 4 views
11

簡単な質問:深いものより浅いものを使うメリットはありますか? コードを書くときには、深いオブジェクトを使用する傾向があるので、理解して分類するのは簡単です。しかし、私はこのカスタムが私のコードを遅くしているのだろうかと思っています。深いオブジェクトがJavaScriptで遅いですか?もしそうならどれくらい

私はテストをしましたが、正しく行っているかどうかはわかりません。

//building necessary objects 
 
var a = {}; 
 
var b; 
 
b = a; 
 
for (var i = 0; i < 100; i++) { 
 
    b["a"] = {}; 
 
    b = b["a"]; 
 
} 
 
var c = {}; 
 

 
//objects used 
 
//a.a.a. ..(101 "a"s).. .a === {} 
 
//c === {} 
 

 
//1st test: shallow 
 
var d; 
 
var start = performance.now(); 
 
for (var i = 0; i < 1000000000; i++) { 
 
    d = c; 
 
    d = null; 
 
} 
 
var end = performance.now(); 
 
console.log('Shallow: ' + (end - start)); 
 

 
//2nd test: deeper 
 
var e; 
 
var start = performance.now(); 
 
for (var i = 0; i < 1000000000; i++) { 
 
    e = a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a; 
 
    e = null; 
 
} 
 
var end = performance.now(); 
 
console.log('Deeper: ' + (end - start));

結果(MS):

shallow 3229 3304 3246 3253 3277 
deep 3375 3343 3247 3193 3248 

深いオブジェクトの試験時間は遅いではなく、時には速く浅いものより。 結果にもかかわらず、私は彼らが同じ速度であると結論付けるのに十分な自信がありません。 2人の間に違いはありますか?

+0

確かにあなたは冗談ですか? 3秒間で10億回の操作が行われ、おそらく±100 ops程度のくすぶりがありますか?工作最悪の場合でも?これは、時期尚早の最適化です!実装とシステムの差異は、両者のパフォーマンスの小さな変化を大幅に上回ります。 – RobG

+0

この種のスピードテストは決して実用的ではありません。実際のコードでこのような方法で使用されることのない人工的なコードスニペットをテストすると、jsエンジンのオプティマイザが実際のコードでこの例では完全に異なって動作する可能性が高くなります。 –

+0

ネストされたアクセスは一般的には遅くなりますが、プロパティのアクセスが高速な 'O(1)'オペレーションであるため、その差は実際には小さすぎます。お使いのコンピュータ上の他の要因やプロセスが、これらのわずかな時間差に貢献する可能性があることに注意してください。 –

答えて

3
  1. をあなたはナンセンス
  2. あなたはDate.nowを(使用している "実際のコードを"、)をテストするために非現実的なコードを使用していますはタイムスタンプの近似値であり、js速度をテストするにはperformance.now()を使用するべきです。現在、良いテストコードであっても、間違った結果が得られます。
  3. JSエンジンは常に更新されています。深い物体が遅い時がありましたが、それは最後のx年の間にはもう起こりません。それは私が何年も忘れることができない何か貴重な何かGoogleのような古い問題です。
+1

ありがとうございました。 –

+0

私が部分的に知りたかったのは、正しくテストしていた場合でした。 performance.now()ははるかに良く見えます。 –

1

jsエンジンでは、オブジェクトに直接アクセスし、到達時間が短い変数で深いオブジェクトをキャッシュすることを可能にする最適化です。したがって、チェーンを経由することなく、それらにアクセスする方が速いです。

var a={a:{a:{}}} 
var b=a.a.a 
var c=b 
// is faster than 
var c=a.a.a 

詳細についてはこの記事を読む:たとえば JavaScript Performance: Mutiple variables or one object?

+0

ここで何を意味するのか分かりません。これは深いネストされたアクセスがいかに遅いかに関する質問に答えるようには思われません。 –

+0

私はそれを明確にするために編集しました – user7951676

+0

OPに手動で 'a.a.a'の値を別の変数に保存し、それを使用する必要がある、あるいはエンジンがその値を自動的にキャッシングしている必要がありますか? OPが 'b = a.a.a'を実行する必要があるということを意味するなら、これは入れ子にされたオブジェクトへのアクセスがどれほど高速であるかの答えよりもむしろ大変です。 –

関連する問題