2012-11-21 31 views
6

İç kısımlar bir dizinin üzerinde döngü yapmaktan daha yavaş olan birçok yerde okudum ... Ancak, büyüklük (tip) bloklarında ilerlemenin, sahnelerin arkasında gerçekleşen her şeyle karşılaştırılınca pratik olarak zahmetsiz olduğunu anladım. nesnenin anahtarlar, ben Neden javascript in-in yavaş?

o anahtarı almak için bir ters karma işlevi yapmak zorunda mı ... tam nedeni o kadar yavaş ki ne olduğunu hala merak ediyorum ve bu süreç yavaş nedir?

+2

Evet, tüm anahtarları almak göreceli yavaş bir süreç için ... onları almıyor karşılaştırıldığında olduğunu tahmin ediyorum; Alanı'nda ilk oysa normal 'for' ile tuşlara arama zorundadır için ...') loop, anahtarı döngü değişkeninden sağlıyorsunuz. –

+2

Burada, "in ... in" için işlevinin "Object.keys()" ile aynı olduğunu gösteren bir JSPerf testi var (en azından Chrome'da): http://jsperf.com/for-in- vs-tuşları-vs-için.Böylece, anahtarların ve/veya bununla ilgili her şeyin daha yavaş olması ve anahtarların dışarıdan sağlanması. Ama aynı zamanda, tıpkı T.J. diyor. –

cevap

3

Belirli bir motor söz konusu olduğunda bunun gerçek cevabı muhtemelen motorun uygulanmasına bağlı olacaktır. (Varsa, farkın boyutu da aynı olacaktır.)

Ancak, değişmezler vardır. Örneğin, göz önünde bulundurun:

var obj = {a: "alpha", b: "beta"}; 
var name; 
for (name in obj) { 
    console.log(obj[name]); 
} 

var arr = ["alpha", "beta"]; 
var index; 
for (index = 0; index < arr.length; ++index) { 
    console.log(arr[index]); 
} 

obj durumunda, motor zaten iterated ve hangi ettik değil, hem de filtreleyerek gelmiş olanları hangi özelliklerin takip etmek için bir mekanizma kullanmak zorunda sayısız özellik. Örneğin, sahnelerin ardında bir tür yineleyici nesnesi vardır (ve özelliklerin tanımlanma biçimi, bu da geçici bir dizi olabilir).

arr durumunda; Bunu kodunuzda, çok basit ve verimli bir şekilde ele alıyorsunuz.

Her döngünün bloğunun içeriği aynıdır: Bir nesneye ait bir özellik araması. (İkinci durumda, teorik olarak, hem de bir numaralı dize dönüştürme var.)

Yani bu sadece sigara uygulama özgü cevap bekliyoruz: Ek havai.

1

for..each döngüler iterators and generators kullanın.

Yineleyici bir next() yöntemi vardır bir amacıdır. Jeneratör, yield() ifadelerini içeren bir fabrika işlevidir. Her iki yapı da bir tamsayı indeks değişkeninden daha karmaşıktır.

Tipik bir for(var i = 0; i < arr.length; i++) döngüsünde, hemen hemen tüm yinelemelerde yürüten iki komut i++ ve i < arr'dur. Bu, bir işlev çağrısı yapmaktan çok daha hızlıdır (next() veya yield()). Ayrıca, döngü başlatması (var i = 0), yineleme nesnesini next() yöntemiyle oluşturmaktan veya yineleyici oluşturmak için jeneratörü çağırmaktan daha hızlıdır. Bununla birlikte, uygulamalara büyük ölçüde bağlıdır ve Javascript motorlarının yaratıcıları, yaygın olarak kullanılan dil özelliklerini hızlandırmak için ellerinden geleni yaparlar.

ben fark benim kodun diğer kısımlarını optimize vaktimi harcamak isteyebilirsiniz, böylece marjinal olduğunu söyleyebilirim. Performans kazanımı karmaşıklık eklemek için çok küçük olduğunda, sözdizimi seçimi kod okunabilirliğini ve sürekliliğini performanstan daha fazla düşünmelidir. Bunu söyledikten sonra, zengin ve ünlü olduktan sonra kodunuzu sürdüren diğer geliştiriciler ve sizinkine daha anlamlı gelen sözdizimini kullanın! ;)