2017-09-05 18 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. JS motorları her zaman güncellenmektedir. Derin nesnelerin yavaş olduğu zamanlar oldu, artık son x yıl için bir durum değil. Yıllarca hatırlayamadığım kadar eski bir problem ya da değerli bir şey google'ı bile hatırlayamıyorum.
+1

Net nokta için teşekkür ederiz. –

+0

Kısmen bilmek istediğim, doğru bir şekilde test edersem oldu. performance.now() çok daha iyi görünüyor. –

1

Nesneye doğrudan erişmek ve ulaşmak için daha az zaman alan bir değişkenin içinde derin nesnelerin paraya çevrilmesine izin vermek js motorunda bir optimizasyondur. Bu yüzden zincirden geçmek zorunda kalmadan onlara ulaşmak daha hızlıdır.

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

fazla bilgi için bunu okuyun: Örneğin JavaScript Performance: Mutiple variables or one object?

+0

Burada ne demek istediğinden emin değilim. Bu, derin iç içe erişimlerin ne kadar yavaş olduğu sorusuna cevap vermiyor gibi görünüyor. –

+0

Daha net hale getirmek için düzenledim – user7951676

+0

OP'nin "a.a.a" değerini başka bir değişkende manüel olarak saklaması ve bunu veya motorlarının bunu otomatik olarak önbelleğe alması gerektiğini mi söylüyorsunuz? Eğer OP'nin “b = a.a.a” yapması gerektiği anlamına gelirse, o zaman bu, iç içe geçmiş nesne erişiminin ne kadar hızlı olduğuna dair bir cevaptan ibarettir. –

İlgili konular