Yerel ES6 neden bluebird'den daha yavaş ve daha bellek yoğun vaat ediyor?


195

Gelen bu kriter , süit Bluebird vaatlerle kıyasla ES6 sözler ile tamamlamak için 4 kat daha uzun sürer ve çok bellek gibi 3.6 kat kullanır.

Bir JavaScript kütüphanesi, V8'in C dilinde yazılan yerel uygulamasından nasıl daha hızlı ve daha hafif olabilir? Bluebird vaadi, yerli ES6'nın vaat ettiği ile tamamen aynı API'ye sahiptir (artı bir sürü ilave fayda metodu).

Yerel uygulama kötü yazılmış mı, yoksa eksik olduğum başka bir yönü var mı?


Modern JavaScript uygulamalarının yoğun şekilde optimize edildiğini ve hatta JIT kullanarak yerel olarak çalışabileceğini unutmayın .

1
Bu Benchmark'a göre , BlueBirdJS aslında Yerli Sözlerden daha yavaştır. Ancak, PromiseMeSpeedJS aslında her ikisini de geride bırakıyor. PromiseMeSpeedJS'in bunu kanıtladığı pek çok şeyden biri, PromiseMeSpeedJS'nin kullanmadığı için, sözler için büyük bir performans newsuçluluğunun operatörün aşırı kullanımıdır new.
Jack Giffin

1
@ JackGiffin Chrome 67: PromiseMeSpeedJS% 46 daha yavaş ve Bluebird% 61 daha yavaş.
FINDarkside

Yanıtlar:


272

Bluebird burada yazar.

V8, uygulamanın JavaScript’te C’de yazılmadığını vaat eder . Ek olarak, kullanıcının yazdığı JavaScript, mümkünse (ve buna değer), yerel koda göre derlenmeden önce optimize edilmiştir. Uygulama sözü, C'ye yazılmasından fazla ya da hiç yararı olmayacak bir şeydir, aslında sadece yavaşlatır çünkü yaptığınız tek şey JavaScript nesnelerini ve iletişimi kullanmaktır.

V8 uygulaması basitçe bluebird kadar optimize edilmemiştir, örnek olarak vaat edenlerin işleyicileri için diziler ayırır . Her bir sözün bir çift diziyi de tahsis etmesi gerektiğinde bu çok fazla hafıza gerektiriyor (Benchmark genel olarak 80 bin vaat ediyor, bu yüzden kullanılmayan 160 bin dizilim var). Gerçekte, kullanım durumlarının% 99,99'u asla bir defadan fazla bir kez söz vermez, bu nedenle bu yaygın durum için en uygun hale getirme, büyük bellek kullanımı iyileştirmeleri kazanır.

V8, bluebird ile aynı optimizasyonları uygulasa bile, yine de spesifikasyonlar tarafından engellenir. new PromiseES6'da bir kök vaadi oluşturmak için başka bir yol olmadığından kıyaslama kriterinin (bluebird'de anti-patern) kullanılması gerekir. new Promisesöz vermenin son derece yavaş bir yoludur, ilk olarak yürütücü işlevi bir kapanış ayırır, ikincisi ise argüman olarak 2 ayrı kapanıştan geçer. Bu, söz başına ayrılan 3 kapanış, ancak bir kapanma, zaten optimize edilmiş bir sözden daha pahalı bir nesnedir.

Bluebird promisify, birçok optimizasyona olanak sağlayan ve geri arama API'lerini tüketmenin çok daha uygun bir yoludur ve tüm modüllerin tek bir satırda söz tabanlı modüle dönüştürülmesini sağlar ( promisifyAll(require('redis'));).


10
"hala şartname tarafından engellenmeli" - Bunun ne anlama geldiğinden emin değilim. ES6'nın doğası gereği yavaş olan bir özelliği izlediğini mi söylüyorsunuz ve eğer durum buysa, bu mavi kuşun aynı özelliği takip etmediği anlamına mı geliyor (ve eğer durum buysa, farklı olanı ve hangisini takip ediyor?)? Ve ES6'nın daha new Promiseaz pahalı hale getirmek için başlatmanın yanı sıra daha iyi bir kök Vaadi oluşturmak için daha iyi bir yolu olmasının herhangi bir nedeni var mı?
Anthony

12
Bu hiç iyi gelmiyor (JS için). Dahili bir uygulama olduğunda bir Promise kütüphanesi kullanmak istemiyorum. Tüm bunlar doğruysa, bu herkes için talihsiz bir durumdur. Ama zaten o hiç değilse çok küçük bir gelişme, ben 100,000 LoC JS uygulamalar yazdım ve hala bunun için herhangi bir gerçek gerek görmüyorum, zaten sorun Promise-yutturmaca görmede bana hayır, çoğunlukla hata tutma, geri çağırma işlemlerinde iyileştirme (kodlama stilimle "geri çağırma cehennemi" hiç olmadı).
Mörre

19
ES6'da Promise.resolve()bir "kök vaadi" oluşturmak için kullanamazsınız ?
zetlen

10
@ MörreNoseshine (devam) Yıllar sonra, ES6 yazarları bir araya geldiler ve "hey, JS motorlarının genel bir Promises / A + uyumlu yardımcı program sağlaması gerektiğini söyleyelim. ". Bu iyi bir kolaylıktır (sadece hızlı Promise.resolve()ya da her neyse bir kütüphaneyi ithal etmek zorunda değilsiniz ), ama çok basit bir uygulama ve varlığı, sizi bluebird gibi daha ciddi sözlerle ilgili araçları kullanarak ertelememeli!
callum

11
@ MörreNoseshine 100k LOC Asla uyumsuz işlevselliğe sahip olmayan muhtemelen Javascript uygulaması. Bluebird olmadan bir mysql / redis kütüphanesi ile bir 100k LoC JS oyunu yazma iyi şanslar.
NiCk Newman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.