2016-10-08 22 views
7

JavaScript'te boş bir nesnenin bellek izi nedir? Sığ Boyut yanı sıra Tutulan Boyut56 eşit olduğunuJavaScript boş obje boyutu

Google Chrome Geliştirici Araçları (Profiller sekmesi) içinde
let emptyObj = {}; 

, anlık aldıktan sonra, bunu gösterir: Nesne nesne değişmez sözdizimini kullanarak oluşturulursa Bayt. Benim için

let emptyObj = Object.create(null); 

sırasında ben (ille boş değil, ama çoğunlukla sadece birkaç özelliklere sahip) nesnelerinin bir sürü oluşturma olarak, yani çok fazla uzak: Nesne tarafından oluşturulursa Ayrıca aynı boyutta mevcut olduğu kod yürütme ve bunları bellekte saklamak zorundayım. Boş nesne boyutunu azaltmak mümkün olsaydı, aynı miktarda Byte'ların özelliklerine sahip bir nesnenin boyutunu azaltmak da mümkündür. Örneğin

, nesne şöyle görünür:

let foo = {bar: 4}; 

ve + 6 (anahtar) + 8 (değer) en 56 (boş bir nesne yükü), diyelim, büyüklüğü vardır = 70 Bayt, 40 bayt ile boş bir nesne daha sonra indirgeme boyutu 30 bayt (16 + 6 + 8) arasında foo olan boyutu neden olur.

Chrome'un boş nesne boyutunun bu doğru yorumu doğru mu? Onu azaltmak mümkün mü? Boş olmayan nesnenin küçültülmesine neden olur mu?

+4

"Düşürmek mümkün mü?" Hayır. Tarayıcının "bir nesne oluştur" işlemini nasıl yorumladığı ve bunu göstermek için bilgisayarınızın belleğinde gerçekte ne depoladığı konusunda hiçbir denetiminiz yoktur. Genel olarak JS'deki nesne boyutları hakkında endişelenmeyi bırakın, sayfalar ve web uygulamaları binlerce olmasa bile yüzlerce kelimenin tam anlamıyla kullanılmasını sağlar. Artık ihtiyacınız olmayan nesnelere ait referansları kaldırmayı unutmayın ve GC gerisini halledecektir. –

+0

Dil belirtimi ([* ECMA-262 *] (http://ecma-international.org/ecma-262/7.0/index.html)), uygulamayı tanımlamamaktadır, bu nedenle bellek ayak izi uygulama arasında farklılık gösterir. Bir nesne değişmezine sahip bir nesne oluşturmak, Nesne yapıcısını kullanarak oluştururken tam olarak aynı sonucu döndürmelidir. – RobG

+0

@MitchKarajohn Maalesef, milyonlarca kişiyi kaydetmem gerekiyor ve bu tutarı azaltamam. Bu yüzden her nesnenin "taban" boyutunun nasıl azaltılacağını anlamaya çalışıyorum. Bu bana büyük bir hafıza kazandırır. – proxeld

cevap

-2

Boş nesne çok boş değil. emptyObj.__proto__ = null yaparsanız, __proto__ zincirini siler. Ancak, Object'un bazı temel yöntemleri için hatalar atabilir. Ancak basit mülk ödevleri ve mülk okumaları iyi sonuç verecektir. Umarım size bazı baytlar kazandırır.

+0

'__proto__' bir nesnenin kendi özelliği değil. Onu silemezsin. Nasıl çalıştığını anlamıyorsanız, lütfen kullanma. Ve yine de kullanımdan kaldırıldı. Bunun yerine 'Object.setPrototypeOf' /' Object.getPrototypeOf' kullanın. – Bergi

+0

Gerçekten boş bir nesneyi istiyorsanız, sadece Object.create (null) 'yi kullanarak örneği oluşturun. Mevcut nesnelerin prototip zinciriyle uğraşmayın. – Bergi

+0

Her halükarda, nesne büyüklüğünde, [Nesne.prototipi] 'yi gösteren [[prototip]] bağlantısı ile [null]' u gösteren [[prototip]] bağlantısı arasında bir bellek farkı yoktur. – Bergi

İlgili konular