Soru JavaScript'te yinelenen işlev çağrısı


İ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?


18
2017-08-17 17:26


Menşei


Sanırım bu bir kapsam meselesi: P Harika bir soru, cevapladıklarını merak ediyorum! - Pelshoff
Fonksiyon çağrısı ek yükü, döngü kontrolünden daha büyüktür; Bu, herhangi bir programlama dili için geçerlidir. Bir işlevi çağırırken yapılacak çok daha fazla muhasebe var: yeni bir kapsam ayırmak ve başlatmak, geri dönüş adresini kaydetmek, parametreleri marş etmek vb. Gibi. JavaScript yorumlayıcılarının çok hızlı bir şekilde hızlandığını unutmayın. yıllık blog yazısı (veya kitap) sorgulanmalıdır. - Pointy
“çünkü ikinci aramanız 10 kat daha yavaş olabilir” metnin söylediği gibi değil. Kodun ikinci versiyonunun 10 kat daha yavaş olduğunu söylüyor. - Brian Gordon
Bu yavaş tekrarlamanın ne kadar iyi olabileceğinin iyi bir kanıtıdır. Her iki testin de aynı sayıda aramaya sahip olması fark yaratıyor. - Jake


Cevaplar:


İş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).


11
2017-08-17 18:10



ES6 kuyruk arama optimizasyonuna sahip olmalıdır. Uygun kuyruk çağrıları - Raynos


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.


3
2017-08-17 18:19