2017-09-05 84 views
11

Basit soru: daha sığ bir nesne üzerinde sığ bir nesne kullanmanın bir yararı var mı? Bir kod yazdığımda, derin bir nesneyi kullanma eğilimindeyim, böylece anlaşılması ve sınıflandırılması kolaydır. Ama bu gelenek benim kodumu yavaşlatıyor mu diye merak ediyorum.JavaScript'te derin bir nesne yavaş mıdır? Eğer öyleyse ne kadar

Bir test yaptım, ancak doğru yapıp yapmadığımı bilmiyorum.

sonucu

//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): Derin nesne için

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

testi kat daha hızlı sığ olandan yavaş değil, hatta bazen. Sonuçlara rağmen, aynı hızda oldukları sonucuna varmak için yeterince güvenmiyorum. İkisi arasında bir fark var mı?

+0

Şaka yapıyor musunuz? 3 saniyeden fazla bir sürede 1 milyar operasyon ve belki yaklaşık 100 ops hakkında bir şeyler mi harcıyorsunuz? Tehlikeli bir kötü durum için bile mi? Bu erken optimizasyon yazı büyük! Uygulamalardaki ve sistemlerdeki varyanslar, ikisi arasındaki performanstaki küçük değişimlere ağır basacaktır. – RobG

+0

Böyle bir tür hız testleri asla gerçekten yararlı değildir. Gerçek kodda asla kullanılmayacak olan bazı yapay kod snippet'ini test edersiniz, bir js motorunun optimiserinin bu örnekte gerçek kod üzerinde tamamen farklı davranması ihtimali yüksektir. –

+0

İç içe girmeler genellikle daha yavaş olacak, ancak bir özellik erişimi hızlı bir 'O (1)' işlemi olduğu için fark gerçekten çok küçüktür. Bilgisayarınızdaki diğer faktörler ve süreçlerin bu küçük zaman farklılıklarına katkıda bulunabileceğini unutmayın. –

cevap

3
  1. Sen saçma
  2. Sen Date.now (kullanmaktır "gerçek kodu",) test etmek için gerçekçi olmayan kod kullanarak hangi zaman damgası için yaklaşık olduğunu ve js hızını test etmek için performance.now() kullanmalısınız. Şu anda, iyi bir test koduyla bile yanlış sonuçlar elde edersiniz.
  3. J