2015-05-20 28 views
5

dizisine bellek Ön tahsis I nesnelerin

var arr = new Array(); 

O zaman Sunucusu tarafından döndürülen nesnelerin bir dizi bilgisi gibi bir dizi ilan sahiptir. Ve bu dizideki her nesnenin üç alanı vardır (her zaman). Bunun için döngü yapmalı ve koşullu olarak arr dizisine eklenmeliyim.

Bu arr'dan önceden ayrılmamış olduğundan, ana dizideki büyük sayılar için performansa vurur.

Bu performans sorununu önlemek için ana yanıt dizisini aldıktan sonra arr dizisini önceden ayırabileceğim herhangi bir yol var mı?

Ayrıca nesnenin boyutunu nasıl alabilirim?

Teşekkürler.

+1

kullanabilirsiniz Bu C değil, üst düzey dillerin tüm noktası bu şeyler hakkında endişelenmenize gerek yok. Döngüleme sorununuz için, döndüğünüz dizi dizisinde 'Array # filter' öğesini çağırın. –

+0

@TasosK. https://gamealchemist.wordpress.com/2013/05/01/lets-get-those-javascript-arrays-to-work-fast/ – aneeshere

cevap

7

10 nesneye sahip olduğunuzu ve her nesneden üç değerin bir diziye geçeceğini varsayalım. Aşağıdaki gibi Array yapıcısına tamsayı 30 ileterek uzunluğu 30 (10 * 3) ile dizi sunabilmesi:

var numObjects = 10; 
var myArray = new Array(3*numObjects); 

kazanmış performansının bir kanıtı benim jsperf kriter bakınız. Kısa özet olarak, dizinizin ön boyutlandırılması Firefox 38'de ~% 25, ​​Chrome 42'de ~% 81 daha hızlı ve Internet Explorer 11'de% ~ 15 daha hızlıdır. Sayılar, bu ölçütleri çalıştıran kişinin deneyimine göre değişir. eğilim tutarlı kalacaktır. En iyi performans, dizilerinizi önceden boyutlandırmanızdan kaynaklanır.
http://jsperf.com/array-growth-dynamic-vs-preset

bu konunun daha ayrıntılı bir tartışma Javascript bellek tahsisi için herhangi bir doğrudan erişim olmadığını iman (veya değil) ne olursa olsun ilah
How to initialize an array's length in javascript?

+3

Bunun herhangi bir olumlu etkisi olduğuna dair bir kanıtı ispatlayabilir misiniz? – max

+1

@papirtiger Evet, gerçekten. – ThisClark

+0

O zaman düzeltilmeyi bekliyorum. – max

2

Thank burada SO üzerinde meydana geldi. Bu interwebs batırma JS çok kalitesi göz önüne alındığında gerçekten korkunç olurdu.

Javascript, kendiliğinden oluşturulma sırasında dizilere bellek tahsis edecek ve toplandığında çöpleri geri alacaktır. Bir dizinin önceden doldurulması, bellek kullanımı veya performans üzerinde pozitif bir etkiye sahip olmayacaktır.

Düzeltme: Hatalıydım. @ ThisClark'in cevabı.

MDN, javascript'te oldukça iyi bir article on how memory management and GC work var.

+0

Ben sizin ve diğer birçoklarının göz ardı edebileceği nokta, onun dediğiniz gibi 'bellek tahsisine doğrudan erişimi' olan Javascript değil, onun dil sürümünü uygulayan web tarayıcısı olduğu gerçeğidir. hangi bellek ayırma erişimi var. Ayrıca, sağladığınız bağlantıda, Javascript'in bellek yönetiminin nasıl ele alındığı konusunda diğer dillerden farklı olduğunu ayıran hiçbir şey yoktur. Makaleden aldığım nokta şu şekildedir: 'Programlama dilinden bağımsız olarak, bellek yaşam döngüsü hemen hemen her zaman aynıdır. ' – ThisClark

+0

Bilginizi paylaştığınız için teşekkürler, burada yeni bir şey öğrendim. Cevaplarımı kaldırmam gerekirse, dizilerin önceden tahsisi konusunda yanıldım ve kendimle tartıştım. Tarayıcının ** bellek tahsisine ** doğrudan erişim sağlamasının daha iyi olabileceğini düşünüyorum; bu, bilinçli bir tasarım tercihi olarak bir ihmal değil. Hala tüm jQuery ninjaların orada tarayıcıdan bir "malloc" olduğunu hackleyeceğini düşünmek için titriyorum. – max

1

Sen, cidden, aşağıdaki örnekte

var result = [ 
    { 
     age: 15 
    }, 
    { 
     age: 21 
    }, 
    { 
     age: 25 
    } 
]; 

function isGreaterThan20(obj) { 
    return obj.age > 20; 
} 

var arr = result.filter(isGreaterThan20); 
// arr becomes [{ age: 21}, { age: 25}] 

Tanımlanan boyuttan bir dizi önceden tahsis etmek gerekirse gibi filter işlevini kullanarak diziyi filtrelemek bu konuda endişelenmeyin new Array(size)