Javascript V8 hızını elde etmek için Ruby, Python'u engelleyen nedir? [kapalı]


261

(Örneğin optimizasyonlar uygulanmasını engelleyen tüm Yakut / Python özellikler var mı satır içi önbellek ) V8 motor var?

Python, Google adamları tarafından birlikte geliştirildiğinden, yazılım patentleri tarafından engellenmemelidir.

Veya bu, Google tarafından V8 projesine yerleştirilen kaynaklar meselesidir.


6
İçgözlem ve operatör aşırı yüklemesi muhtemelen büyük olanlar, ancak JS'yi size gerçek bir cevap verecek kadar iyi bilmiyorum. PyPy projesi muhtemelen Python'un JS tür hızlarına ulaşmak için en iyi şansı.
ncoghlan

11
Tam kilitlenmeler olan bilgisayar dili çekimleri dışında PyPy'nin V8'den daha yavaş olduğu herhangi bir örneğiniz var mı (sadece şeylerin farklı dillerde orada nasıl uygulandığına bakın). Yoksa sadece Google'ın gerçeklik bozulma alanı mı?
fijal

3
V8, Python ile eşit değil. Daha iyi bir karşılaştırma yapmak için V8'in 1.8 Javascript spesifikasyonunu uygulaması gerekene kadar bekleyin. Ve bu noktada birinin Javascript yerine V8 motorunun üstüne PyPy'yi uygulamaya çalışacağından eminim.
Michael Dillon

14
Neden V8'in Python veya Ruby'den daha hızlı olduğundan emin misiniz? Ne?
jcoffland

6
V8 kesinlikle Python / Ruby'den daha hızlı. Her iki ortamda da deyimsel olarak yazılan basit bir mikrobenchmarktan kapsamlı bir gerçek dünya uygulamasına kadar istediğiniz her türlü ölçütü yapın. Çoğu dile özgü işlem için daha hızlı bir büyüklük sırasıdır (örneğin, Python'da C koduna devredilmeyen şeyler).
Hejazzman

Yanıtlar:


519

Javascript V8 hızını elde etmek için Ruby, Python'u engelleyen nedir?

Hiçbir şey değil.

Tamam, para. (Ve zaman, insanlar, kaynaklar, ancak paranız varsa, bunları satın alabilirsiniz.)

V8, üzerinde yüksek performanslı yürütme oluşturma konusunda onlarca yıllık deneyime sahip (bireysel olarak konuşuyorum - toplu olarak yüzyıllar gibi) parlak, son derece uzmanlaşmış, yüksek deneyimli (ve dolayısıyla yüksek ücretli) bir mühendis ekibine sahiptir. dinamik OO dilleri için motorlar. Temelde Sun HotSpot JVM'yi (diğerlerinin yanı sıra) yaratan aynı kişilerdir.

Baş geliştirici Lars Bak, tam anlamıyla tüm profesyonel yaşamı olan 25 yıldır VM'ler üzerinde çalışıyor (ve tüm bu VM'ler V8'e ulaştı). Ruby VM'leri yazan bazı insanlar 25 yaşında bile değil.

V8 motorunun sahip olduğu optimizasyonların uygulanmasını engelleyen herhangi bir Ruby / Python özelliği var mı?

En azından IronRuby, JRuby, MagLev, MacRuby ve Rubinius'un ya monomorfik (IronRuby) veya polimorfik satır içi önbelleğe sahip olduğu göz önüne alındığında, cevap açıkça hayırdır.

Modern Ruby uygulamaları zaten çok fazla optimizasyon yapıyor. Örneğin, belirli işlemler için, Rubinius'un Hashsınıfı YARV'lardan daha hızlıdır. Şimdi, Rubinius'un Hashsınıfının% 100 saf Ruby'de uygulandığını anlayana kadar bu çok heyecan verici görünmüyor, YARV'lar ise% 100 elle optimize edilmiş C'de uygulandı.

Yani, en azından bazı durumlarda, Rubinius GCC'den daha iyi kod üretebilir!

Veya bu, Google tarafından V8 projesine yerleştirilen kaynaklar meselesidir.

Evet. Sadece Google değil. V8'in kaynak kodunun soyu 25 yaşında. V8 üzerinde çalışan insanlar da Self VM'yi (bugüne kadar oluşturulmuş en hızlı dinamik OO dil yürütme motorlarından biri), Animorphic Smalltalk VM'yi (bugüne kadar oluşturulmuş en hızlı Smalltalk yürütme motorlarından biri), HotSpot'u yarattı JVM (şimdiye kadar oluşturulan en hızlı JVM, muhtemelen en hızlı VM dönemi) ve OOVM (şimdiye kadar oluşturulan en verimli Smalltalk VM'lerden biri).

Aslında, V8'in baş geliştiricisi Lars Bak, bunların her birinde artı birkaçında çalıştı.


1
"En azından IronRuby, JRuby, MagLev, MacRuby ve Rubinius'un ya monomorfik (IronRuby) veya polimorfik satır içi önbelleğe sahip olduğu göz önüne alındığında, cevabın açıkça hayır olduğu konusunda bazı referans literatürümüz olabilir mi? Lütfen?
WDRust

14
SpiderMonkey benzer bir performansa sahip, o zaman Mozilla nasıl yaptı? Çok sınırlı paraları var ..
Salman von Abbas

8
@SalmanPK: Bu onların ilk VM'si değil ve Mozilla'da çalışan akıllı insanlar da var.
Matthieu

3
@SalmanPK, miguel: Mozilla, en azından kısmen ters mühendislik V8 ile JS VM'lerini yarattı. blog.mozilla.org/dmandelin/2010/09/08/presenting-jagermonkey
Ian

2
@Ian V8 açık kaynak kodlu (BSD lisansı), bu yüzden tersine mühendislik yapmaya gerek yok, sadece ne yaptıklarına bakın.
dbkk

78

JavaScript yorumlayıcılarını yüksek oranda optimize etmek için çok daha fazla itici güç var, bu yüzden Mozilla, Google ve Microsoft arasında çok fazla kaynağın eklendiğini görüyoruz. JavaScript (genellikle sabırsız) bir insan beklerken gerçek zamanlı olarak indirilmeli, ayrıştırılmalı, derlenmeli ve çalıştırılmalıdır. bilgisayar, telefon veya ekmek kızartma makinesi olabilir. Bu koşullar altında etkin bir şekilde çalışabilmek için verimli olmak zorundadır.

Python ve Ruby, geliştirici / dağıtıcı tarafından kontrol edilen bir ortamda çalıştırılır. Genellikle sınırlayıcı faktörün yürütme süresi değil, bellek veya disk G / Ç gibi şeyler olacağı bir etli sunucu veya masaüstü sistemi. Veya önbellekleme gibi motor dışı optimizasyonların kullanılabileceği yerler. Bu diller için, hız optimizasyonu üzerinde ayarlanan dil ve kütüphane özelliklerine odaklanmak muhtemelen daha mantıklıdır.

Bunun yan yararı, Node.js gibi her türlü uygulama için yeniden tasarlanabilen ve yeniden kullanılabilen iki büyük yüksek performanslı açık kaynaklı JavaScript motorumuz olmasıdır.


43

Bunun iyi bir kısmı toplumla ilgilidir. Python ve Ruby çoğunlukla kurumsal desteğe sahip değil. Hiç kimse Python ve Ruby'de tam zamanlı çalışmak için para almaz (ve özellikle bütün zaman boyunca CPython veya MRI'da çalışmak için para almazlar). Öte yandan V8, dünyanın en güçlü BT şirketi tarafından desteklenmektedir.

Dahası, V8 daha hızlı olabilir, çünkü V8 insanları için önemli olan tek şey yorumlayıcıdır - üzerinde çalışacak standart bir kütüphaneleri yoktur, dil tasarımı hakkında endişeleri yoktur. Sadece tercüman yazıyorlar. Bu kadar.

Fikri mülkiyet hukuku ile ilgisi yoktur. Python, Google adamları tarafından da geliştirilmemiştir (yaratıcısı orada birkaç komisyonla birlikte çalışır, ancak Python'da çalışmak için para almazlar).

Python hızının bir diğer engeli Python 3'tür. Benimsenmesi, dil geliştiricilerinin ana endişesi gibi görünüyor - diğer uygulamalar yakalanana kadar yeni dil özelliklerinin gelişimini dondurmuşlar.

Teknik detaylara gelince, Ruby hakkında çok şey bilmiyorum, ancak Python'un optimizasyonların kullanılabileceği birkaç yeri var (ve bir Google projesi olan Unladen Swallow, tozu ısırmadan önce bunları uygulamaya başladı). İşte planladıkları optimizasyonlardan bazıları . CPython için bir JIT a la PyPy uygulandığında Python'un gelecekte V8 hızını kazandığını görebiliyordum, ancak bu önümüzdeki yıllar için olası görünmüyor (şu anda odak PIThon 3'ün benimsenmesi, JIT değil).

Birçoğu aynı zamanda Ruby ve Python'un kendi küresel tercüman kilitlerini kaldırmanın çok büyük faydası olabileceğini düşünüyor .

Ayrıca Python ve Ruby'nin JS'den çok daha ağır diller olduğunu anlamalısınız - standart kütüphane, dil özellikleri ve yapı açısından çok daha fazlasını sağlarlar. Yalnızca nesne yönelimi sınıf sistemi büyük bir ağırlık katmaktadır (bence iyi bir şekilde). Javascript'i neredeyse Lua gibi gömülmek üzere tasarlanmış bir dil olarak düşünüyorum (ve birçok yönden benzerler). Ruby ve Python çok daha zengin özelliklere sahiptir ve bu ifade genellikle hız pahasına olacaktır.


3
Aslında Python 3.2'nin son sürümünden bu yana yeni özellikler hakkındaki moratoryum kaldırıldı.
jd.

2
+1, ancak yeni dil özelliklerinin dondurulması optimizasyon için daha fazla zaman harcamak anlamına gelmez mi?
Andrew Grimm

1
@Eğer sadece takın. Odak noktası Jython, IronPython ve PyPy'yi hızlandırmak, kütüphanelerin Python 3'e dönüşmesini beklemek ve Python 3'ü evangelize etmektir.
Rafe Kettler

2
"Yalnızca nesne yönelimi sınıf sistemi büyük bir ağırlık katıyor" - V8 gibi modern JavaScript VM'lerinin sınıfları var, sadece örtük. Python'da olduğu gibi, JavaScript'e de açıkça bir değişken yazmak zorunda değilsiniz, açıkça bir sınıf yazmak zorunda değilsiniz. VM, kodunuzdan geçecek ve sınıfları çıkaracak kadar zekidir.
Benjamin Gruenbaum

1
Anladığım kadarıyla, V8 bir tercümandan ziyade bir JIT derleyicisidir ... Eminim ikisi arasında bir ayrım vardır. Belki de ... Bilmiyorum.
Luke

24

Performans, "yeterince hızlı" nın yeterince iyi olduğunu düşünen ve programcıların daha üretken olmasına yardımcı olan özelliklerin, bilgisayarların daha hızlı kod çalıştırmasına yardımcı olan özelliklerden daha önemli olduğunu düşünen çekirdek Python geliştiricilerinin ana odağı gibi görünmüyor.

Ancak, standart yorumlayıcı ile uyumlu daha hızlı bir Python yorumlayıcısı üretmek için yüksüz yutmak üzere (şimdi terk edilmiş) bir Google projesi vardı . PyPy , daha hızlı bir Python üretmeyi amaçlayan başka bir projedir. Orada da Psyco , bütün tercüman dışarı değiştirmeden birçok Python komut için performansı artışı sağlayabilir PYPY, ve öncüsü Cython Python sözdizimi gibi çok şey kullanarak Python için yüksek performanslı C kütüphaneleri yazmanıza olanak tanır.


13

Yanıltıcı soru. V8, JavaScript'in bir JIT (tam zamanında derleyici) uygulamasıdır ve en popüler tarayıcı olmayan uygulaması Node.js'de bir olay döngüsü etrafında oluşturulur. CPython bir JIT değildir ve olay değildir. Ancak bunlar Python'da en yaygın olarak PyPy projesinde bulunur - CPython 2.7 (ve yakında 3.0+) uyumlu bir JIT. Örneğin Tornado gibi çok sayıda olaylı sunucu kütüphanesi var. Tornado vs Node.js çalıştıran PyPy arasında gerçek dünya testleri var ve performans farklılıkları az.


3
Tornado'dan bahsettiği için +1 . Node.js ile karşılaştırılabilir bir hızda ilerlerken, gen.enginemodülü Python jeneratörleri ve yieldifadesi ile birlikte ( 2.5'ten beri !!! asenkron kodunuzu yeniden tanımlayabilir.
Lukas Bünger

1
Yayınınızdan bu yana, pypy kararlı bir 3.x destekli sürüm yayınladı (ve tabii ki desteği geliştirmeye devam ediyor): morepypy.blogspot.fr/2014/06/pypy3-231-fulcrum.html
Zeograd

9

Ben sadece bu soruya rastladım ve performans farkının bahsedilmeyen büyük bir teknik nedeni de var. Python'un güçlü yazılım uzantıları için çok büyük bir ekosistemi vardır, ancak bu uzantıların çoğu performans için C veya diğer düşük düzeyli dillerde yazılmıştır ve CPython API'sine büyük ölçüde bağlıdır.

CPython uygulamasını hızlandırmak için kullanılabilecek birçok iyi bilinen teknik (JIT, modern çöp toplayıcı, vb.) Vardır, ancak hepsi API'de önemli değişiklikler yapılmasını gerektirecek ve bu da süreçteki uzantıların çoğunu kıracaktır. CPython daha hızlı olurdu, ancak Python'u bu kadar çekici kılan birçok şey (kapsamlı yazılım yığını) kaybolacaktı. Durumda, orada birkaç hızlı Python uygulaması var, ancak CPython'a kıyasla çok az çekişe sahipler.


9

Farklı tasarım öncelikleri ve kullanım senaryo hedefleri nedeniyle inanıyorum.

Genel olarak komut dosyası yazmanın (dinamik olarak da bilinir) temel amacı, yerel işlevlerin çağrıları arasında bir "tutkal" olmaktır. Ve bu yerel işlevler a) en kritik / sık kullanılan alanları kapsamalı ve b) mümkün olduğunca etkili olmalıdır.

İşte bir örnek: iOS Safari'nin donmasına neden olan jQuery sıralaması Oradaki donma, seçici alma çağrılarının aşırı kullanılmasından kaynaklanıyor. Seçici tarafından yerel kodda uygulanacaksa ve etkin bir şekilde böyle bir sorun olmayacaktır.

V8 demosu için sıkça kullanılan demo-tracer demosunu düşünün. Python dünyasında, Python yerel uzantılar için tüm olanakları sağladığı için yerel kodda uygulanabilir. Ancak V8 bölgesinde (istemci tarafı sanal alanında) VM'nin [alt] mümkün olduğunca etkili olmasını sağlamaktan başka seçeneğiniz yoktur. Ve böylece tek seçenek görmek bkz: ray-tracer uygulaması script kodu kullanarak.

Farklı öncelikler ve motivasyonlar.

In Sciter ben doğal olarak hemen hemen tam jQurey çekirdeğini uygulayarak bir test yaptık. ScIDE (HTML / CSS / Script'ten yapılmış IDE) gibi pratik görevlerde , bu tür çözümlerin herhangi bir VM optimizasyonundan çok daha iyi çalıştığına inanıyorum.


5

Diğer insanların belirttiği gibi, Python'un PyPy şeklinde performans gösteren bir JIT derleyicisi var .

Anlamlı ölçütler yapmak her zaman inceliklidir, ancak farklı dillerde yazılmış K-araçlarının basit bir ölçütüne sahibim - burada bulabilirsiniz . Kısıtlamalardan biri, çeşitli dillerin hepsinin aynı algoritmayı uygulaması ve basit ve deyimsel (hız için optimize edilmenin aksine) olmaya çalışması gerektiğiydi. Tüm uygulamaları yazdım, bu yüzden hile yapmadığımı biliyorum, ancak tüm diller için yazdıklarımın deyimsel olduğunu iddia edemem.

Kesin bir sonuç iddia etmiyorum, ancak PyPy aldığım en hızlı uygulamalar arasındaydı, Düğümden çok daha iyiydi. Bunun yerine CPython sıralamanın en yavaş sonundaydı.


5

İfade tam olarak doğru değil

Tıpkı V8'in sadece JS için bir uygulama olduğu gibi, CPython da Python için sadece bir uygulamadır. Pypy, V8'lerle eşleşen performanslara sahiptir .

Ayrıca, algılanan performans sorunu da var: V8 yerel olarak engelleme yapmadığından, Web geliştiricisi daha fazla performans gösteren projelere yol açıyor çünkü IO beklemesini kurtarıyorsunuz. Ve V8 esas olarak IO'nun anahtar olduğu dev Web için kullanılır, bu yüzden benzer projelerle karşılaştırırlar. Ancak Python'u web geliştirici dışında birçok alanda kullanabilirsiniz. Ayrıca, bilimsel uzantılar veya şifreleme gibi birçok görev için C uzantılarını bile kullanabilir ve yanan perflerle verileri kırabilirsiniz.

Ancak web'de en popüler Python ve Ruby projeleri engelleniyor. Özellikle Python, eşzamanlı WSGI standardının mirasına sahiptir ve ünlü Django gibi çerçeveler buna dayanmaktadır.

Asenkron Python (Twisted, Tornado, gevent veya asyncio gibi) veya Ruby yazabilirsiniz. Ancak bu sık yapılmaz. En iyi araçlar hala engelliyor.

Ancak, Ruby ve Python'daki varsayılan uygulamaların V8 kadar hızlı olmamalarının bazı nedenleri.

Deneyim

Jörg W Mittag'in belirttiği gibi, V8 üzerinde çalışan erkekler VM dahisi. Python, birçok alanda çok iyi olan tutkulu bir grup insan tarafından geliştirildi, ancak VM ayarında uzman değil.

kaynaklar

Python Yazılım vakfı çok az paraya sahiptir: Python'a yatırım yapmak için yılda 40 bin'den az . Google, Facebook veya Apple gibi büyük oyuncuların Python kullandığını düşündüğünüzde bu biraz çılgınca, ama bu çirkin gerçek: çoğu iş ücretsiz olarak yapılır. Youtube'a güç veren ve Java'dan önce var olan dil gönüllüler tarafından el işi.

Akıllı ve özverili gönüllülerdir, ancak bir alanda daha fazla meyve suyuna ihtiyaç duyduklarını belirlediklerinde, bu uzmanlık alanı için birinci sınıf bir uzman işe almasını isteyemezler. Bunu ücretsiz olarak yapacak birini aramak zorundalar.

Bu çalışırken, öncelikleriniz konusunda çok dikkatli olmanız gerektiği anlamına gelir. Bu nedenle, şimdi şunlara bakmalıyız:

Hedefler

En son modern özelliklerle bile Javascript yazmak korkunç. Kapsam belirleme sorunları, çok az koleksiyon, korkunç dize ve dizi manipülasyonu, tarih, matematik ve regex'ler dışında neredeyse hiç stdlistiniz yok ve çok yaygın işlemler için bile sözdizimsel şeker yok.

Ama V8'de hızınız var.

Bunun nedeni, hızın Google için ana hedef olmasıydı, çünkü Chrome'da sayfa oluşturma için bir engel.

Python'da kullanılabilirlik ana hedeftir. Çünkü bu neredeyse hiçbir zaman projenin darboğazı. Buradaki kıt kaynak geliştirici zamandır. Geliştirici için optimize edilmiştir.


1

Çünkü JavaScript uygulamalarının ciltlerinin geriye dönük uyumluluğunu önemsemeleri gerekmez.

Yakın zamana kadar JavaScript uygulamalarının tek kullanıcıları web tarayıcılarıydı. Güvenlik gereksinimleri nedeniyle, yalnızca web tarayıcı satıcılarının çalışma zamanlarına bağlamalar yazarak işlevselliği genişletme ayrıcalığı vardı. Bu nedenle, bağlantıların C API'sini geriye doğru uyumlu tutmaya gerek yoktu, JavaScript çalışma zamanları geliştikçe web tarayıcı geliştiricilerinin kaynak kodlarını güncellemelerini istemeye izin verildi; her neyse birlikte çalışıyorlardı. Oyunun sonuncusu olan ve aynı zamanda çok deneyimli bir geliştiricinin önderlik ettiği V8 bile API'yi daha iyi hale geldi.

OTOH Ruby (çoğunlukla) sunucu tarafında kullanılır. Birçok popüler ruby ​​uzantısı C bağlama olarak yazılır (RDBMS sürücüsünü düşünün). Başka bir deyişle, Ruby, uyumluluğu sürdürmeden asla başaramazdı.

Bugün, fark hala bir dereceye kadar var. Node.js kullanan geliştiriciler, V8 API'yi zaman içinde değiştirdiğinden (ve node.js'nin çatallanma nedenlerinden biri) yerel uzantılarını geriye doğru uyumlu tutmanın zor olduğundan şikayet ediyorlar. IIRC yakut hala bu konuda çok daha muhafazakar bir yaklaşım izlemektedir.


1

V8, JIT, Krank Mili, tip inferencer ve veri optimizasyonlu kod sayesinde hızlı. Etiketlenmiş işaretçiler, çiftlerin NaN etiketlemesi. Ve elbette ortada normal derleyici optimizasyonları yapar.

Sade yakut, python ve perl motorları bunlardan hiçbirini yapmaz, sadece küçük temel optimizasyonlar.

Yaklaşan tek büyük vm, tür çıkarım, sabit katlama, NaN etiketleme veya tamsayı bile yapmayan, ancak kötü diller kadar yağ değil, benzer küçük kod ve veri yapıları kullanan luajit'tir. Prototip dinamik dillerim, iksirim ve p2 luajit ile benzer özelliklere sahip ve v8'den daha iyi performans gösteriyor. İsteğe bağlı bir tip sistem olan "kademeli yazma" ile, krank milini atlayabileceğiniz için v8'den kolayca daha iyi performans gösterebilirsiniz. Bkz. Dart.

Pypy veya jruby gibi bilinen optimize edilmiş arka uçlar hala çeşitli aşırı mühendislik tekniklerinden muzdariptir.


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.