Bu cevapla geniş bir resim vermeye çalışıyorum.
Parantez içindeki şu düşünceler oldu ben sadece son zamanlarda konuyu test ettik kadar inancımı:
[[ C / C ++ gibi düşük seviyeli diller açısından kod, bir değişken sıfır olduğunda (veya sıfır olmadığında) işlemcinin özel bir koşullu atlama komutuna sahip olması için derlenir.
Ayrıca, bu kadar optimizasyonu önemsiyorsanız, bunun yerine gidebilirsiniz , çünkü tek bir işlemci komutu anlamına gelir .]]
++i
i++
++i
i++
j=i+1, i=j
Gerçekten hızlı döngüler onları açarak yapılabilir:
for(i=800000;i>0;--i)
do_it(i);
Şundan çok daha yavaş olabilir
for(i=800000;i>0;i-=8)
{
do_it(i); do_it(i-1); do_it(i-2); ... do_it(i-7);
}
ancak bunun nedenleri oldukça karmaşık olabilir (sadece bahsetmek gerekirse, oyunda işlemci komutu önişleme ve önbellek işleme sorunları vardır).
İstediğiniz gibi JavaScript gibi üst düzey diller açısından, kütüphanelere, döngü için yerleşik işlevlere güveniyorsanız işleri optimize edebilirsiniz. En iyi nasıl yapılacağına karar vermelerine izin verin.
Sonuç olarak, JavaScript'te,
array.forEach(function(i) {
do_it(i);
});
Ayrıca hataya daha az eğilimlidir ve tarayıcıların kodunuzu optimize etme şansı vardır.
[HATIRLATMA: sadece tarayıcılar değil, aynı zamanda kolayca optimize edebileceğiniz bir alanınız var forEach
, en yeni en iyi hileyi kullanması için işlevi (tarayıcıya bağlı olarak) yeniden tanımlamanız yeterli ! :) @AMK özel durumlarda array.pop
veya kullanmaya değer olduğunu söylüyor array.shift
. Bunu yaparsanız, perdenin arkasına koyun. En fazla aşırıforEach
döngü, döngü algoritmasını seçmek için seçenekler eklemektir .]
Ayrıca, düşük seviyeli diller için de en iyi uygulama, mümkünse karmaşık, ilmekli işlemler için bazı akıllı kütüphane işlevlerini kullanmaktır.
Bu kütüphaneler ayrıca (çok iş parçacıklı) şeyleri arkanıza da koyabilir ve ayrıca uzman programcılar onları güncel tutar.
Biraz daha fazla inceleme yaptım ve C / C ++ 'da, 5e9 = (50.000x100.000) operasyonlar için bile, testin @alestanis'in söylediği gibi bir sabite karşı yapılması durumunda yukarı ve aşağı gitme arasında bir fark olmadığı ortaya çıkıyor. (JsPerf sonuçları bazen tutarsızdır, ancak genel olarak aynı şeyi söylerler: büyük bir fark yaratamazsınız.)
Yani --i
oldukça "lüks" bir şey olur. Sadece daha iyi bir programcı gibi görünmenizi sağlar. :)
Öte yandan, bu 5e9 durumda un-unrolling için, 10s gittiğimde 12 saniye 2.5 saniye ve 20s gittiğimde 2.1 saniye düştü. Optimizasyon yoktu ve optimizasyon işleri ölçülemez az zamana indirdi. :) (Kaldırma işlemi yukarıdaki şekilde veya kullanarak yapılabilir i++
, ancak bu JavaScript'te bir şey getirmez.)
Sonuçta: tutmak i--
/ i++
ve ++i
/ i++
iş görüşmeleri, sopa ki farklar array.forEach
olan veya diğer kompleks kütüphane fonksiyonları. ;)