İkinci çağrınızın 10 kata kadar daha yavaş olabileceğinden, JavaScript'teki işlevlere tekrar tekrar çağrı yaparken hafifçe basmanız gerektiğini biliyorum.
Elverişli JavaScript devletler:
Önemli bir sorun var: Çoğu JavaScript uygulamasında, bu ikinci sürüm ilkinden yaklaşık 10 kat yavaş. JavaScript'te, basit bir döngü çalıştırmak, bir işlevi birden çok kez çağırmaktan çok daha ucuzdur.
John Resig bile bunun bir problem olduğunu söylüyor. bu sonrası.
Sorum şu: özyineleme neden bu kadar verimsiz? Belirli bir motorun inşa edildiği yol mu? Durumun böyle olmadığı bir zamanda JavaScript'te bir zaman göreceğiz mi?
İşlev çağrıları, yığının değiştirilmesine ve yeni bir bağlam oluşturulmasına bağlı olarak basit bir döngüden daha pahalıdır. Özyinelemenin çok verimli olabilmesi için, bir dil, temel olarak belirli türdeki özyinelemeli fonksiyonların döngülere dönüştürülmesi anlamına gelen bir tür kuyruğa son vermeyi desteklemelidir. OCaml, Haskell ve Scheme gibi işlevsel diller bunu yapar, fakat farkında olduğum bir JavaScript uygulaması yok (hepsi olmadıkça sadece marjinal olarak yararlı olur, bu yüzden belki de bir yemek filozofları sorunumuz var).
Bu, tarayıcıların kullandığı belirli JS motorlarının oluşturulduğu bir yoldur, evet. Kuyruk çağırma ortadan kaldırılmadan, her tekrarladığınızda yeni bir yığın çerçevesi oluşturmanız gerekir, oysa bir döngü ile sadece programın sayacını başlangıcına döndürür. Şema, örneğin, dil özelliklerinin bir parçası olarak buna sahiptir, bu nedenle özyinelemeyi performanstan endişe etmeden bu şekilde kullanabilirsiniz.
https://bugzilla.mozilla.org/show_bug.cgi?id=445363 Firefox'ta yapılan ilerlemeyi gösterir (ve Brendan Eich, burada muhtemelen ECMAScript'in bir parçası haline getirildiğinden bahseder), fakat şu andaki tarayıcıların hiç birinin henüz uygulanmadığını düşünmüyorum.