Soru PHP'yi Java veya C # 'dan daha yavaş yapan nedir?


Bu her zaman merak ettiğim bir şey: PHP'nin Java ya da C # 'dan daha yavaş olması bu dillerin 3'ünün baytkoduna kadar derlenip oradan çalıştırılmasıdır? Normalde PHP'nin her bir istek ile her dosyayı yeniden derlediğini biliyorum, ancak APC'yi (bir bayt kodu önbelleği) resme getirdiğinizde bile performans, Java ya da C # 'nin yakınında değil (APC büyük ölçüde geliştiriyor olsa da).

Düzenle: Web düzeyinde bu dillerden bile bahsetmiyorum. Ben numara çırpma olduklarında bunların karşılaştırmasından bahsediyorum. Başlangıç ​​zamanı veya bunun gibi bir şey dahil bile.

Ayrıca, burada verilen cevaplara dayanarak bir tür karar vermiyorum. PHP, tercih ettiğim dildir; Sadece tasarımını merak ettim.


25
2017-09-10 21:07


Menşei


Bu, savaş-savaş bölgesine yakınlaşıyor. Onu öznel olarak işaretlemek en iyisi - mcjabberz
topluluk wiki olmalı - SilentGhost
Bu büyük bir sorudur ve kesinlikle öznel veya tartışmacı değildir. Daha fazla kredi IMO hak ediyor. - Sasha Chedygov


Cevaplar:


Bunun bir sebebi, JIT derleyicisinin PHP'de bulunmaması, diğerlerinin de bahsettiği gibi.

Bir başka büyük sebep PHP'nin dinamik yazım. Dinamik olarak yazılan bir dil, her zaman statik olarak yazılan bir dilden daha yavaş olacaktır; çünkü değişken türleri, derleme zamanı yerine çalışma zamanında kontrol edilir. Sonuç olarak, C # ve Java gibi statik olarak yazılan diller, çalışma zamanında önemli ölçüde daha hızlı olacaklar, ancak bunlar genellikle önceden derlenmiş olmalıdır. Bir JIT derleyicisi, dinamik olarak yazılan diller için daha az sorun çıkarır, ancak alas, PHP'nin yerleşik bir sürümü yoktur ( HHVM PHP için üçüncü taraf bir JIT örneği.


38
2017-09-10 20:47



Dinamik yazmayı belirtmek için +1. İyi bir nokta! - mcjabberz
Bu daha önce bahsetmedim şaşırdım! IMO, bir JIT derleyicisine sahip olmamasından daha büyük bir performans sorunudur, ancak bunun birçok faktöre bağlı olduğunu tahmin ediyorum. - Sasha Chedygov
İyi dinamik yazım kesinlikle JIT derleme ve genel çalışma zamanı optimizasyonları daha ilginç hale getirir! - mcjabberz
PHP bytecode önbellekleri, kaynak kodlarını esas olarak önbelleğe aldıklarından bu yana çok yardımcı olurlar. Ancak bytecode çevirisi, bytecode -> makine kodunun önbelleğe alınmış veya optimize edilmiş bir çevirisi yoktur. Sadece daha temel düzeyde yorumlanır. - Justin
Bir bayt kodu önbelleği, dinamik yazım sorununda hala yardımcı olmaz. Ve dediğin gibi, bytecode hala yorumlanmalıdır. Bu yüzden, statik olarak yazılmış, derlenmiş, JITed dili ile rekabet edemez. - Sasha Chedygov


Sanırım elmaları ve portakalları karşılaştırmaya birazcık katlanıyorsunuz - bu dilleri web uygulamaları oluşturmak için kullandığınızı varsayarak, sadece dilden çok daha fazlası var. (Ve çok zaman sizi yavaşlatan veritabanı olduğunu ;-) ;-)

Bu dillerden birini diğerine göre seçmeyi asla tavsiye etmem. hız argüman.


9
2017-09-10 20:51



+1 Hız, kodun ne kadar iyi yazıldığına dair çoğu zaman, aptal kriterlerde ölçülen hızdaki nispi farklılıklar hakkında değil. İyi geliştiriciler bu platformlardan herhangi birini uçurabilir. - ChristopheD
Ben bir dil seçmiyorum. PHP, tercih ettiğim dildir (web için, en azından). Sadece merak ettim. - ryeguy
Bu, hız farkını yaratan diller değil, (derlenmiş) kodlarının yürütülmesidir. Diğerlerinin de belirttiği gibi, java ve .NET sanal makineleri oldukça iyi ayarlanmıştı, php'nin çalıştırılma şekli daha az optimize edilmiş olabilirdi. Eğer bu bir teorik / dil limiti ise ya da sadece php için yapılacak iş meselesi tartışmaya açıktır. (Javascript performansındaki son artışın görülmesi, php uygulamasının hızlandırılmasının oldukça mümkün olduğunu düşünüyorum) - Simon Groenewolt


Hem Java hem de C # var JIT derleyicileribytecode alır ve gerçek makine koduna derler. Derleme eylemi zaman alabilir, bu nedenle C # ve Java daha yavaş başlangıç ​​zamanlarından muzdarip olabilir, ancak kod JIT derlendikten sonra, C ++ gibi herhangi bir "gerçekten derlenmiş" dil ile aynı oyun parkındadır.


5
2017-09-10 20:51



+1 Cevabınız temel olarak benimkiyle aynı. Neden aşağı oy kullanıldığını anlamıyorum - mcjabberz


En büyük tek neden, Java'nın HotSpot JVM ve C # 'nin CLR'sinin Just-In-Time (JIT) derlemesini kullanmasıdır. JIT derlemesi, bayt kodlarını doğrudan işlemci üzerinde çalışan yerel koda indirir.

Ayrıca, Java bytecode ve CIL'in PHP'nin iç bayt kodundan daha düşük seviyede olduğunu düşünüyorum. Bu da JIT optimizasyonlarının daha kolay ve daha etkili olmasını sağlayabilir.


4
2017-09-10 20:45





JAVA'nın bir çeşit “uygulama” sunucusuna bağlı olması, bir PHP tahmininde bulunmama ihtimalidir. Bu, PHP'nin her seferinde yeni bir ortamın oluşturulması gerektiğidir.

(Bu özellikle PHP bir CGI olarak kullanıldığında / bir Apache modülü olarak veya FastCGI üzerinden kullanıldığında geçerlidir)


Başka bir fikir C # ve JAVA derleyicilerinin derleme zamanında bazı ağır optimizasyonlar yapabilmeleri olabilir - diğer tarafta PHP betikleri derlendikçe (en azından, bir opcode önbelleği ile "aldatmazsanız) Bir sayfa her çağrıldığında, derleme aşaması çok hızlı olmalı; Bu, optimizasyon için çok zaman harcamanın mümkün olmadığı anlamına gelir.


Yine de: PHP'nin her sürümü genellikle performansların bir miktar iyileşmesi ile birlikte gelir; Örneğin, PHP 5.2'den 5.3'e geçerken CPU'nun% 15 ila% 25'i arasında kazanç elde edebilirsiniz.

Örneğin, şu ölçütlere bir göz atın:


Bir önemli şey de, PHP'nin ölçeklendirilmesi oldukça kolay: sadece birkaç tane web sunucusu ve voila ekleyin!

1'den birkaç sunucuya gittiğinizde sıklıkla karşılaştığınız sorun oturumları içerir - DB'de veya memcached'de depolayın (çok kolay)ve problem çözüldü!


Bir sidenote olarak: Bir teknoloji seçmenizi tavsiye etmeyeceğim çünkü bazı kıyaslamalarda hızın bir kaç yüzde farkı var: ekibinizin her bir teknolojiyi ne kadar iyi bildiği gibi - veya hatta algoritmalarınız çok daha önemli faktörler var. kullanacak!


2
2017-09-10 20:51





Yorumlanan bir dil, derlenmiş bir dilden daha hızlı ve hatta önemsiz koşullar altında bir JIT dili olmaktan çıkamaz.

Test programınız, hız hakkında endişeleriniz varsa "Merhaba Dünyalar" ı yazdırmaktan ibaret değilse, C # veya Java ile sopa.


0
2017-09-10 20:51



Sadece bugünlerde yorumlanmış veya derlenmiş diller diye bir şey yok! - dVaffection


Ne yapmak istediğine bağlı. Bazı durumlarda, PHP kesinlikle daha hızlıdır. PHP (güzel) dosya manipülasyon ve diğer temel şeyler (aynı zamanda XML şeyler) iyi. Java veya C # bu durumlarda daha yavaş olabilir (karşılaştırmamıza rağmen).

Ayrıca, PHP çıktısı (HTML veya her neyse), tarayıcıyı da indirmeli ve zaman da tüketir.

Ayrıca, Java / C # hızı, üzerinde çalıştığı makineye bağlı olarak çok fazladır (çoklu olabilir). Java / C # bilgisayarınızda yavaş olabilir, PHP sadece bir sunucu üzerinde çalışır ve her zaman sunucu kadar hızlıdır (indirme süreleri, vb. Hariç).

Genel anlamda karşılaştırılabilir olduklarını düşünmüyorum. Bence bu üç programlama diliyle başarabileceğin bir görev almalısın ve sonra bunu karşılaştır. Temel olarak her zaman bir programlama dili seçerken yapmanız gerekenler; göreve uygun olanı bul. Programlama diline uyana kadar görevi şekillendirmeyin.


-2



Karşılaştırman çok anlamlı değil. OP basit, ham sayı-çatırdama performansı hakkında soru soruyordu ve neden PHP'deki bir yöntem Java / C # 'da aynı yöntemden daha yavaş olurdu. - Sasha Chedygov
Eh, çok anlamlı değildi çünkü karşılaştırmalar yapmak zor. Muhtemelen tatmin edici olmayan bir başka karşılaştırma ise 'Neden armut ve sonra elma?' Diye sormaktır. Her ikisi de meyvedir (PHP / Java'nın her ikisi de programlama dilidir) ancak sorunun çok farklı olmasından dolayı soruya gerçek bir cevap yoktur. - Jake
Katılmıyorum. Armutların neden elmalardan daha tatlı olduğunu açık bir şekilde anlayabilirsiniz (eğer meyvelerinizi yeterince iyi biliyorsanız). Dillerin farklı kullanımları olabilir, ancak bunları yan yana kıyaslayamamanız gerekir. - Sasha Chedygov


Göre wikipedia, PHP kullanır Zend Motoru, hangi bulunmamaktadır bir JIT.


-3