2014 While
geri döndü
Sadece mantıklı düşünün.
Şuna bak
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- En az 2 değişken (dizin, uzunluk) oluşturmanız gerekir
- Dizinin uzunluktan küçük olup olmadığını kontrol etmeniz gerekiyor
- Dizini artırmanız gerekiyor
for
Döngü 3 parametre vardır
Şimdi bana bunun neden daha hızlı olması gerektiğini söyleyin:
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- Bir değişken
- Kontrol yok
- endeks azalır (Makineler bunu tercih eder)
while
sadece bir parametresi var
Chrome 28 for döngüsünün zamandan daha hızlı olduğunu gösterdiğinde tamamen kafam karıştı. Bu bir çeşit
"Ah, herkes for döngüsünü kullanıyor, krom için geliştirirken buna odaklanalım."
Ama şimdi, 2014 yılında while döngüsü krom üzerinde. 2 kat daha hızlı, diğer / eski tarayıcılarda her zaman daha hızlıydı.
Son zamanlarda yeni testler yaptım. Şimdi gerçek dünya ortamında bu kısa kodlar hiçbir şeye değmez ve jsperf aslında while döngüsünü düzgün çalıştıramaz, çünkü aynı zamanda zaman alan array.length'i yeniden oluşturmanız gerekir.
jsperf üzerinde bir while döngüsünün gerçek hızını elde edemezsiniz.
kendi özel işlevinizi oluşturmanız ve window.performance.now()
Ve evet ... while döngüsünün daha hızlı olmasının bir yolu yok.
Asıl sorun aslında dom manipülasyonu / oluşturma zamanı / çizim zamanıdır ya da istediğiniz gibi.
Örneğin ben koordinatları ve çarpışmaları hesaplamak için gereken bir tuval sahne var ... Bu 10-200 MicroSeconds (milisaniye değil) arasında yapılır. aslında her şeyi işlemek için milisaniye sürer. DOM'daki gibi.
FAKAT
loop
Bazı durumlarda for özelliğini kullanmanın başka bir süper performans yolu var ... örneğin bir diziyi kopyalamak / klonlamak için
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
Parametrelerin ayarına dikkat edin:
- While döngüsünde olduğu gibi sadece bir değişken kullanıyorum
- Dizinin 0'dan büyük olup olmadığını kontrol etmeniz gerekir;
- Gördüğünüz gibi ben 3th parametre içinde şeyler yapmak ve ben de doğrudan dizi içinde azaltmak gibi herkesin kullandığı döngü için normal vs vs farklıdır.
Dedi ki, bu makineleri -
biraz daha kısa yapmak ve bazı işe yaramaz şeyler kaldırmak ve aynı tarzı kullanarak bu yazmayı düşünüyordum yazma:
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
Daha kısa olsa bile, i
bir kez daha kullanmak her şeyi yavaşlatır. Önceki for
döngüden ve 1 / 1'den daha yavaş while
.
Not:;
olmadan looo için sonra çok önemlidir{}
Ben sadece jsperf komut dosyalarını test etmek için en iyi yolu olmadığını söyledi bile .. ben bu 2 döngü burada ekledi
http://jsperf.com/caching-array-length/40
Ve burada javascript'teki performans hakkında başka bir cevap
https://stackoverflow.com/a/21353032/2450730
Bu cevap, javascript yazmanın etkili yollarını göstermektir. Eğer okuyamıyorsanız, sorun ve javascript http://www.ecma-international.org/ecma-262/5.1/