2016-09-09 13 views
7

, sayı dizisi için nesnelerin bir dizi dönüştürür aşağıdaki pasajı, göz önünde bulundurun: Bu gibi birlikte zincirleme zamanYerel harita, filtre, vb. Yöntemler mümkünse tek bir aracı dizi üzerinde çalışacak şekilde optimize edilmiş mi? Negatif değerler 2 tarafından filtre edilmiş ve daha sonra iki ile

var objects = (new Array(400)).fill({ 
    value: Math.random() * 10 - 5 
}); 

var positiveObjectValuesDoubled = objects.map(
    item => item.value 
).filter(
    value => value > 0 
).map(
    value => value * 2 
); 

, kaç gerçek Dizi nesnelerdir toplam olarak oluşturuldu mu? 1 mi, 3 mü? (başlangıç ​​objects dizisi hariç). Özellikle

, ben zincirinin ikinci map çağrısıyla sonra filter tarafından oluşturulan aracı Dizi nesneler hakkında konuşurken ve ediyorum: Bu dizi nesneleri dikkate açıkça başına değil başvurulan, JavaScript optimize etmek kadar akıllı çalışma zamanları vardır Bu durumda mümkün olduğunda, aynı hafıza alanını kullanmak için?

Bu, evet ya da hayır bilgisiyle net olarak yanıtlanamazsa, bunu çeşitli tarayıcılarda nasıl belirleyebilirim? (Bildiğim kadarıyla, the array constructor can no longer be overridden kadarıyla, bu bir seçenek değil yani)

+3

Diziler büyük olasılıkla oluşturulacak; Bunu esasen akış işlemine dönüştürmek muhtemelen bir Javascript motorunun yapacağı daha karmaşıktır. Dizilerin içindeki * değerler * büyük olasılıkla içeride/başvuruda bulunacaktır, bu nedenle, içerdiği değerlerden değil, yalnızca dizi yapısının kendisinin üst kısmına sahip olursunuz. Ayrıca, ilk 'map' tarafından yaratılan dizi, 'filter' ile yapıldığı zaman toplanan çöp olabilir, bu yüzden kaç tane dizinin bir kerede bellekte olacağını söylemek zor. – deceze

+1

Bu sorunun yanında, fakat FWIW, bunu üç işlem zincirinin yerine bir “küçült” operasyonu olarak uyguluyorum; Bu, tek başına dizi yineleme sayısı daha verimli olduğu garanti edilir. – deceze

+0

@deceze * "Bunu, üç işlem zincirinin yerine bir azaltma işlemi olarak kullanırdım" * - her ne olursa olsun, bu teorik bir sorudur. Yüksek performans kodunda hangi ek yaklaşımların mümkün olabileceği gibi, profilleme hemen belirgin bir cevap vermez *. ES5 dizi işlevlerinin okunabilirliği, özellikle ES6 ok işlevleriyle olağanüstüdür, dolayısıyla bu adamlara bakma. –

cevap

0

İyi açıklama şimdiye kadar, burada bir özet cevap var: bir motor zincirleme yöntem çağrıları arasında bellek kullanımı için optimize olabilir, ama üzerinde saymak asla sizin için optimizasyon yapmak için bir motor.

Zincirli yöntemler örneğiniz değerlendirilirken, motorun bellek yığını aynı sırayla etkilenir, step by step (MDN documentation on the event loop). Ancak, bu nasıl çalışır motoruna bağlı olabilir ... bazı Array.map() için yeni bir dizi oluşturabilir ve çöp bir sonraki iletiyi çalıştırmadan önce eski bir tane toplayabilir, boşluk yeniden ihtiyaç duyulana kadar eskiyi asılı kalabilir, belki Bir diziyi yerinde değiştirin, her neyse. Bunu anlamak için tavşan deliği çok derin.

Bunu test edebilir misiniz? Ara sıra! jQuery or javascript to find memory usage of page, this Google documentation, başlamak için iyi yerlerdir. Ya da en azından bir şeyin ne kadar pahalı olabileceğine dair bir fikir verebilecek olan http://jsperf.com/ gibi bir şeye bakın. Ancak bu süreyi kendi kodunuzda doğrudan optimizasyon yaparak da kullanabilirsiniz. Muhtemelen daha iyi bir çağrı.

İlgili konular