Python neden Java'dan daha yavaş ama PHP'den daha hızlı [kapalı]


17

Bir çok dilin belirli bir görevde nasıl performans gösterdiğini gösteren çeşitli ölçütler gördüm.

Bu kriterler her zaman Python'un Java'dan daha yavaş ve PHP'den daha hızlı olduğunu ortaya koyuyor ve neden böyle olduğunu merak ediyorum.

  • Java, Python ve PHP sanal bir makinenin içinde çalışır
  • Her üç dil de programlarını işletim sisteminin üstünde çalışan özel bayt kodlarına dönüştürür - böylece hiçbiri yerel olarak çalışmaz
  • Hem Java hem de Python "derlenebilir" ( .pycPython için) ancak __main__Python modülü derlenmemiştir

Python ve PHP dinamik olarak yazılır ve Java statik olarak - Java'nın daha hızlı olmasının nedeni budur ve öyleyse lütfen bunun hızı nasıl etkilediğini açıklayın.

Ve dinamik-statik statik argümanı doğru olsa bile, bu PHP'nin neden Python'dan daha yavaş olduğunu açıklamaz - çünkü her ikisi de dinamik dillerdir.

Bazı kriterler görebilirsiniz burada ve burada ve burada


Python ve PHP ile ilgili olarak: büyük olasılıkla sadece bir uygulama kalitesi sorunudur.
Charles Salvia

8
@good_computer Çoğu kıyaslama çok kötü yapılmış. İnceleyen çoğu insanın "en hızlı" olduğunu iddia ettiği dilin en iyi şekilde optimize edilmiş koddan şikayet ettiğinden yakın zamanda başka bir tane (bağlantı kurduğunuzu sanmıyorum) vardı. Bu genellikle bilinçsizce "yavaş" olarak kabul edilen dillere aşina olmayan biri tarafından yapılır, bu yüzden "hızlı" buldukları dilde daha iyi kod yazdıklarını fark etmezler.
Izkata

@good_computer Bana öyle geliyor ki, sorunuz " Her zaman bu ölçütler Python'un Java'dan daha yavaş ve PHP'den daha hızlı olduğunu gösteriyor " ve " PHP Python'dan daha yavaş " metnini içeriyor . Bu alıntıları kaldırmak ve soruyu dil bilincine dönüştürmek yeniden açılmasını sağlayabilir.
briddums

Bu soru gerçekten önyargılıdır : (1) acemi programcılar tarafından ustalaşmadıkları dillerde (ilgili yorum konularında kesildiği gibi) yazılan çok naif olarak optimize edilmemiş kodlar üzerinde yapılan yetkili olmayan karşılaştırmalar ve (2) yanlış anlama üzerine inşa edilmiş yorumlanmış / bayt kodu dilleri hakkında (php / python yorumlanır, java'nın bayt kodlu, python önbellek dosyaları bayt kodu değil soyut sözdizim ağaçlarıdır) ve üç dilin durumu (hem python hem de php'nin derlenmiş sürümleri vardır - python'lar daha olgun, derlenmiştir php, gerçi, facebook çalıştırır)
ZJR 16:12

Yanıtlar:


26

JVM kodu, önemsiz (ve hızlı) geçici bir derleyici kullanılarak verimli bir şekilde JIT olarak derlenebilir. Ancak aynı şey, dinamik olarak yazılmış doğaları nedeniyle PHP ve Python için son derece zor olurdu. JVM, bir C ++ derleyicisinin üreteceğine oldukça benzer, oldukça düşük seviyeli ve basit bir yerel koda çevirir, ancak dinamik diller için kelimenin tam anlamıyla tüm temel işlemler ve tüm yöntem çağrıları için dinamik gönderim oluşturmanız gerekir. Bu dinamik dağıtım, bu türdeki tüm diller için birincil darboğazdır.

Bazı durumlarda, dinamik dağıtımı (Java'daki sanal çağrıların yanı sıra) çok daha karmaşık bir izleme JIT derleyicisi kullanarak ortadan kaldırmak mümkündür. Bu yaklaşım hala başlangıç ​​aşamasındadır, çok fazla soyut bir yorum yapmaz ve böyle bir derleyicinin eval(dinamik diller için çok tipik olan) çağrıları boğması muhtemeldir .

Python ve PHP arasındaki farka gelince, ikincisi çok daha düşük kalitede. Teoride daha hızlı koşabilirdi, ama asla olmayacak.


1
JIT neden dinamik diller için "olağanüstü" zor? JavaScript dünyasında v8 veya TraceMonkey'e bakın - JIT iyi çalışıyor.
treecoder

6
@good_computer, izleme JIT'leri normalden, ad hoc JIT'lerden çok daha karmaşıktır ve statik olarak yazılan diller için hala JIT'lerden çok daha yavaş performans gösterirler. Uygun bir izleme JIT'i, tam anlamıyla soyut bir yorum içerir ve her evalçağrıda boğulur .
SK-logic

2
Muhtemelen Oracle'ın HotSpot derleyici ekibinde "önemsiz" kısım hakkında aynı fikirde olmayan yüz kadar mühendis var :-)
Jörg W Mittag

1
@ JörgWMittag, elbette, HotSpot o kadar basit değil, biraz statik analiz yapıyor, çalışma zamanı profil oluşturma sonuçlarını kullanıyor, ancak yine de uygun bir izleme JIT'den çok daha basit. Ve şunu söyleyebilirim ki, HotSpot aşırı karmaşıktır ve uygulanması, kibarca söylemek gerekirse, biraz fazla ayrıntılıdır.
SK-logic

1
@Frank Shearar, dinamik bir dil için özel bir JIT, statik olarak yazılmış bir dil için olduğu kadar önemsizdir (örneğin, bkz. LuaJIT). OTOH, verimli bir JIT tamamen farklı bir şeydir.
SK-mantığı

21

Bu sorunun genel bir sorunu var, çünkü çok mutlak. "X dili Y dilinden daha hızlıdır" demek pek mantıklı değildir. Bir bilgisayar dilinin kendisi "hızlı" veya "yavaş" değildir, çünkü sadece bir algoritmayı ifade etmenin bir yoludur. Asıl soru, "X dilinin X1 uygulaması neden bu özel sorun alanı için Y dilinin Y1 uygulamasından daha hızlı?"

Bazı hız farklılıkları, belirli alanların uygulanması diğer alanlara göre daha kolay olduğundan, dilin kendisinden ayrılacaktır. Ancak uygulamayı hızlı kılan şeylerin çoğu dil değildir. Örneğin, CPython, IronPython veya PyPy hakkında konuşup konuşmayacağınızı düşünmeden gerçekten "Python Java'dan daha yavaştır" diyemezsiniz. Bu, özellikle VM'nin kalitesinden doğrudan etkileneceği için VM kullanan diller için geçerlidir.

Bir yana, çeşitli nedenlerden ötürü cihazımızda JIT'i normalde destekleyen çok popüler bir JavaScript VM ile kullanamayan bir sistemle çalışıyorum. Bu, JavaScript'imizin benzer bir işlemciye sahip bir bilgisayarda olduğundan çok daha yavaş çalıştığı anlamına gelir. Doğrudan dilin kendisi ile ilgili olmayan bu değişiklik, JavaScript'in "C ++ 'dan birkaç kat daha yavaş" olmasını, önem verdiğimiz görevler için "C ++' dan daha yavaş büyüklük sıraları" olmasını sağlar.

Ayrıca, dillerin performans özelliklerinde doğrudan karşılaştırılamayacak şekillerde farklılık gösterdiğini düşünün. Çok fazla ölçüt, bir programı yalnızca A dilinden B diline çevirir ve hangi özelliklerin hızlı olduğu konusunda dillerin farklı olduğunu dikkate almaz. (Bunu, Foo dilinde nasıl uygulayacağımı gösterdiğiniz için "teşekkürler" gibi sık sık not aldıkları gibi bağlantı kurduğunuz gibi makul bir karşılaştırma karşılaştırmasında görebilirsiniz.)

Örneğin, şu Java kodunu alın:

for(int i=0;i<10;i++) {
    Object o = new Object;
    doSomething(o);
}

Bunu C ++ ile "yeniden yazmak" ve çalışma sürelerini karşılaştırmak cazip olurdu:

for(int i=0;i<10;i++) {
    Object *o = new Object;
    doSomething(o);
    delete(o);
}

Mesele şu ki, herhangi bir yetkili C ++ programcısı hemen C ++ 'da bunun bir şey yapmanın en hızlı yolu olmadığını görecektir. İşleri C ++ için daha uygun olacak şekilde değiştirerek kolayca hızlandırabilirsiniz:

for(int i=0;i<10;i++) {
    Object o;
    doSomething(&o);
}

Mesele, C ++ 'ın hızlı olabileceği değil, dilleri karşılaştırmak için kıstaslar yazmaktan çok, gerçekten zor. Uygun şekilde yapmak için her iki dilde de uzman olmanız ve her iki dilde de sıfırdan yazmanız gerekir. O zaman bile, bir dilin belirli bir görevde üstün olduğu alanlara kolayca girebilirsiniz. Örneğin, herhangi bir makul derleyicide Java'dan daha hızlı çalışacak C ++ 'ta Hanoi Towers'ın bir sürümünü yazabilirim. Bunu derleme zamanında değerlendirilen C ++ şablonlarını kullanarak hile yaparak yapabilirim (http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)

Buradaki nokta, "C ++ Java'dan daha hızlı" diyemediğim için, programımın Java sürümü dakikalar boyunca çalışırken anında geri döndü (ve hiç kimse programımın yarım saat sürdüğünü fark etmesini umuyordu.) dar durumda değişir, C ++ daha hızlıdır. Diğer dar durumlar için bunun tersi olabilir. Yani "C ++ daha hızlıdır" değil, "C ++ şablonları kullanarak ifadeyi oluşturma zamanında değerlendirebileceğiniz durumlarda daha hızlıdır." Daha az tatmin edici, ama gerçek.

Dillerdeki hız farklılıkları çoğunlukla uygulama ile ilgilidir. Derlenen diller yorumlanan dillerden daha hızlı olacaktır. Yerel koda derleme, bayt koda derlemekten daha hızlı olacaktır. Bunun, dilin statik olarak yazılıp yazılmamasından daha fazla etkisi olacaktır. Ve elbette, iyi uygulamalar kötü olanlardan daha hızlı olacaktır.

Ve unutmayın ki iyi programcılar kötü programcılardan daha hızlı kod üreteceklerdir, çoğu zaman dil farklılıklarından oldukça ağır basar.


6

Derleyicinin kalitesi ile ilgilidir, java derleyicisi sürekli daha uzun süre optimize edilmiştir ve optimizasyon daha önemlidir çünkü tüm kod Java için derlenmiştir. Python'un PHP'den daha hızlı olmasının kesin nedeninden emin değilim, ancak Google'ın Python ile olan etkisi nedeniyle bahse girerim.


8
Bu neden reddedildi? Bu tam olarak cevaptır: performans tamamen bir araştırma ve mühendislik çabası ve dolayısıyla para demektir. Java uygulamaları üreten şirketler, Python veya PHP uygulamaları üreten şirketlerden daha zengindir. Bu kadar.
Jörg W Mittag

1
Ayrıca, kodu okumak için çok zor hale getirir ve sadece performansı çok az arttırırsa CPython optimizasyonlarının kabul edilmediğinden eminim.
cgt

2
+ Jörg W Mittag: Katılmıyorum. Bazı dil özelliklerinin performansının uygulanması çok zor olabilir, bu nedenle verimli bir uygulamanın oluşturulmasını çok zor veya imkansız hale getirir. Öte yandan, "Assembler" dilinin "verimli" bir uygulamasını oluşturmak son derece kolaydır.
user281377

@ammoQ Bunların çoğunun tip sistemlerine ve özellikle hangi tipe sahip olduğunuzu ve izin verilen işlemlerin tam anlamını tam olarak bilme yeteneğine geldiğinden şüpheleniyorum. Dinamik diller, doğası gereği esneklik kazanır, ancak tür kanıtlarını yapmayı zorlaştırır (ve böylece güvenli hiper hızlı kod için derleme).
Donal Fellows

1
@DonalFellows Kesinlikle benim düşüncem. Derleme zamanında ne kadar az bilinirse, çalışma süresi boyunca o kadar çok şey çözülmelidir.
user281377

4

Java neden en hızlısıdır:

Çalışan kodu agresif bir şekilde yeniden derlemek için statik olarak yazılmış + JIT derleme + --server bayrağı.

Python neden PHP'den daha hızlı:

Python dinamik bir dil olabilir, ancak yine de güçlü bir şekilde yazılmıştır. Bu, kodladığınız yapıların çalışma zamanı optimizasyonu yapabileceği anlamına gelir.

PHP neden berbat:

Temelde sunucuda javascript (çok iş parçacığı desteği yok, tamamen dinamik, gevşek yazılmış).

Özünde, derleyici kodunuzu ne kadar çok bilirse, o kadar çok optimize edebilir. Java çalıştırılmadan önce ve çalışırken tamamen optimize edilebilir. Python çalışırken optimize edilebilir ve PHP korkunçtur. Facebook aslında PHP'yi sunucuya girmeden önce C'ye aktarır.
https://developers.facebook.com/blog/post/2010/02/02/hiphop-for-php--move-fast/


Aslında sunucudaki javascript Node.JS ve anladığım kadarıyla (bunu kanıtlayamayacağım halde) V8 motoru genel olarak PHP'den daha iyi performans gösteriyor (muhtemelen bir tonda olmasa da). Ayrıca Python'un yerel olarak derlenebileceğinden bahsetmelisiniz (Java ile karşılaştırıldığında nasıl performans gösterir?)
Jimmy Hoffa

Orada size yardımcı olmak için yeterince python kullanmadım, ancak V8 çalıştıran nodejs'lerin yerel C uzantıları için desteğe sahip olduğunu söyleyebilirim (JS / C sınırını geçmek sözde yavaş olsa da), ayrıca Google'ın JIT derleyicisinden yararlanabilir. .. Düğüm hem python hem de php'den daha hızlı olursa şaşırmam. İşte bir kıyaslama (çoğu gibi kusurlu) blog.famzah.net/2010/07/01/… Bir yorumcu karşılaştırmada kusurlarımızı gösterene kadar java'nın JS'den daha yavaş göründüğünü unutmayın ... Yani, bir tane ile alın tuz. :)
Ajax

Bununla birlikte, düğüm ve php de tekil iş parçacıklıdır ve küme proxy'lerini (haproxy gibi) kurmayı sevmediğiniz sürece, bunlardan birine ciddi bir üretim ortamında dokunmam.
Ajax

1

Testler, ağır matematiksel programlama lehine çarpıktır.

Nerede ve neden ilk yazıldığını düşünürseniz, Python'un karmaşık matematikte oldukça iyi olması şaşırtıcı değildir .

Öte yandan PHP, web sayfalarını sunmak için yazılmıştır, başka şeyler yapabilir, ancak web sayfaları, bu görevde Java'dan daha iyi veya daha iyi olan şeydir .

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.