2009-09-10 12 views
25

To jest coś, co zawsze zastanawiałem się: dlaczego PHP jest wolniejsze niż Java lub C#, jeśli wszystkie 3 z tych języków zostaną skompilowane do kodu bajtowego, a następnie wykonane? Wiem, że zwykle PHP rekompiluje każdy plik z każdym żądaniem, ale nawet jeśli wprowadzisz APC (pamięć podręczną kodu bajtowego) do obrazu, wydajność jest nigdzie bliska wartości Java lub C# (chociaż APC znacznie ją poprawia).Co sprawia, że ​​PHP wolniej niż Java lub C#?

Edytuj: Nie mówię nawet o tych językach na poziomie sieci. Mówię o porównaniu ich, gdy są chrupiące numery. Nawet nie wliczając czasu startowego czy czegoś w tym stylu.

Ponadto, nie podejmuję żadnej decyzji w oparciu o odpowiedzi tutaj. PHP jest moim ulubionym językiem; Po prostu byłem ciekawy jego projektu.

+1

Zbliża się to do terytorium wojny ogniowej. Najlepiej oznaczyć go jako subiektywny – mcjabberz

+1

powinien być społecznością wiki – SilentGhost

+6

To jest świetne pytanie, a na pewno nie subiektywne czy kłótliwe. Zasługuje na więcej kredytu IMO. –

Odpowiedz

38

Jednym z powodów jest brak kompilatora JIT w PHP, o czym wspominali inni.

Innym ważnym powodem jest dynamiczne pisanie w języku PHP . Dynamicznie napisany język zawsze będzie wolniejszy niż język statycznie napisany, ponieważ typy zmiennych są sprawdzane w czasie wykonywania zamiast w czasie kompilacji. W rezultacie statycznie wpisane języki, takie jak C# i Java, będą znacznie szybsze w czasie wykonywania, choć zwykle muszą być kompilowane z wyprzedzeniem. Kompilator JIT sprawia, że ​​jest to mniej problematyczne dla dynamicznie pisanych języków, ale niestety, PHP nie ma wbudowanego (chociaż zobacz na Facebooku HHVM jako przykład niezależnego JIT dla PHP).

+0

+1 za wymienienie dynamicznego pisania. Słuszna uwaga! – mcjabberz

+0

Jestem zaskoczony, że nie wspomniano o tym wcześniej! IMO jest to większy problem z wydajnością niż brak kompilatora JIT, ale myślę, że to zależy od wielu czynników. –

+0

Cóż za dynamiczne pisanie zdecydowanie sprawia, że ​​kompilacja JIT i ogólne optymalizacje runtime są bardziej interesujące! – mcjabberz

2

Dziczy domysły mogą polegać na tym, że JAVA zależy od jakiegoś "serwera aplikacji", podczas gdy PHP tego nie robi - co oznacza, że ​​nowe środowisko musi być tworzone za każdym razem, gdy wywoływana jest strona PHP.

(Było to szczególnie ważne, gdy PHP był/jest używany jako CGI, a nie jako moduł Apache lub poprzez FastCGI)


Innym pomysłem może być, że C# i kompilatory Java może zrobić jakiś ciężki optymalizacje w czasie kompilacji - z drugiej strony, ponieważ skrypty PHP są kompilowane (przynajmniej, jeśli nie "oszukujesz" z pamięcią podręczną kodu) za każdym razem, gdy strona jest wywoływana, faza kompilacji musi być naprawdę szybka ; co oznacza, że ​​nie można poświęcić wiele czasu na optymalizację.


Nadal: każda wersja PHP generalnie ma pewne ulepszenia w przedstawieniach; na przykład można uzyskać od 15% do 25% mocy procesora podczas przełączania z PHP 5.2 na 5.3.

Na przykład, spójrz na tych benchmarków:


Jedną ważną rzeczą, również to, że PHP jest dość łatwe do skalowania: wystarczy dodać kilka serwerów WWW i voila!

Problem często spotykany podczas przechodzenia od 1 do kilku serwerów odbywa się za pomocą sesji - przechowuj te w DB lub memcached (bardzo łatwe), a problem rozwiązany!


Jak sidenote: Nie polecam wyborze technologii, ponieważ istnieje kilka procent różnicy prędkości na jakiś punkt odniesienia: są znacznie bardziej istotne czynniki, takie jak jak dobrze zespół znać każdą technologię - lub, nawet, algorytmy, których będziesz używać!

9

Zgaduję, że jesteś trochę w porównaniu jabłek i pomarańczy tutaj - zakładając, że używasz wszystkich tych języków do tworzenia aplikacji internetowych, jest w tym trochę więcej niż tylko język.(I wiele razy jest to baza danych, która cię spowalnia ;-)

Nigdy nie sugerowałbym wyboru jednego z tych języków zamiast drugiego na podstawie argumentu prędkości.

+9

+1 Prędkość jest w większości przypadków o tym, jak dobrze napisany jest kod, a nie o względnych różnicach prędkości mierzonych w głupich testach porównawczych. Dobrzy programiści mogą sprawić, że każda z tych platform będzie latać. – ChristopheD

+3

Nie wybieram języka. PHP jest moim ulubionym językiem (przynajmniej w Internecie). Byłem po prostu ciekawy. – ryeguy

+0

To naprawdę nie języki, które powodują różnicę prędkości, ale sposób, w jaki ich (skompilowany) kod jest wykonywany. Jak wspomnieli inni, wirtualne maszyny java i .NET zostały dostrojone dość dobrze, może być tak, że sposób, w jaki php jest wykonywane, jest mniej zoptymalizowany. Jeśli jest to teoretyczny/językowy limit lub tylko kwestia pracy dla php facetów jest prawdopodobnie przedmiotem debaty. (Widząc ostatni wzrost wydajności javascript myślę, że jest całkiem możliwe przyspieszenie wykonywania php) –

4

Największym pojedynczym powodem jest to, że Java HotSpot JVM i C# w C# używają kompilacji Just-In-Time (JIT). Kompilacja JIT kompiluje bajty kodu do natywnego kodu, który działa bezpośrednio na procesorze.

Również myślę, że kod bajtowy Java i kod CIL są niższe niż wewnętrzny kod bajtowy PHP, co może ułatwić i usprawnić wiele optymalizacji JIT.

-1

Zależy od tego, co chcesz zrobić. W niektórych przypadkach PHP jest zdecydowanie szybszy. PHP jest (całkiem) dobry w manipulowaniu plikami i innymi podstawowymi rzeczami (również XML). Java lub C# mogą być wolniejsze w tych przypadkach (chociaż nie testowałem).

Ponadto, wyjście PHP (HTML lub cokolwiek innego) musi zostać pobrane do przeglądarki, co również pochłania czas.

Również prędkość Java/C# zależy w dużym stopniu od maszyny, na której działa (może to być wiele). Java/C# może działać wolno na twoim komputerze, podczas gdy PHP działa tylko na jednym serwerze, z którego jest dostępny, i jest zawsze tak szybki, jak serwer (z wyjątkiem czasów pobierania itp.).

Nie sądzę, że są one porównywalne w sposób ogólny. Myślę, że musisz podjąć się zadania, które można wykonać za pomocą tych trzech języków programowania, a następnie porównać to. To jest zasadniczo zawsze to, co powinieneś zrobić przy wyborze języka programowania; znajdź ten, który pasuje do zadania. Nie kształtuj zadania, dopóki nie zostanie dopasowane do języka programowania.

+1

Twoje porównanie nie ma większego sensu. OP pytał o prostą, nieobrobioną wydajność numerowania i dlaczego metoda w PHP byłaby wolniejsza niż ta sama metoda w Javie/C#. –

+0

Cóż, nie miało to większego sensu, ponieważ porównania są trudne. Innym, prawdopodobnie niesatysfakcjonującym, porównaniem jest pytanie "Dlaczego gruszki swetra to jabłka?". Oba są owocami (tak jak PHP/Java są językami programowania), ale nie ma prawdziwej odpowiedzi na to pytanie, ponieważ różnią się one znacznie. – Jake

+0

Nie zgadzam się. Możesz jasno wytłumaczyć, dlaczego gruszki są słodsze od jabłek (jeśli dobrze znasz swoje owoce). Języki mogą mieć różne zastosowania, ale nie powinno to powstrzymywać cię od porównywania ich obok siebie. –

5

Zarówno Java, jak i C# mają JIT compilers, które pobierają kod bajtowy i kompilują do prawdziwego kodu maszynowego. Kompilowanie go może zająć trochę czasu, stąd też C# i Java mogą cierpieć z powodu wolniejszych czasów uruchamiania, ale gdy kod zostanie skompilowany JIT, jego wydajność jest w tym samym polu, co każdy "naprawdę skompilowany" język, taki jak C++.

+0

+1 Twoja odpowiedź jest w zasadzie taka sama jak moja. Nie widzę powodu, dla którego powinieneś zostać odrzucony pod numerem – mcjabberz

0

Nie ma mowy, że język interpretowany może być szybszy niż język skompilowany, a nawet język JIT na błahych warunkach.

O ile program testowy nie polega na wydrukowaniu "Hello Worlds", jeśli obawiasz się o szybkość, trzymaj się C# lub Java.

+0

W dzisiejszych czasach nie istnieje coś takiego jak języki zinterpretowane lub skompilowane! – dVaffection

Powiązane problemy