Wielokrotnie widziałem różne testy porównawcze, które pokazują, jak wiele języków radzi sobie z danym zadaniem.
Te testy porównawcze zawsze ujawniają, że Python jest wolniejszy niż Java i szybszy niż PHP i zastanawiam się, dlaczego tak jest.
- Java, Python i PHP działają w maszynie wirtualnej
- Wszystkie trzy języki konwertują swoje programy na niestandardowe kody bajtów działające na systemie operacyjnym - więc żaden z nich nie działa natywnie
- Zarówno Java, jak i Python można „skompilować” (
.pyc
dla Pythona), ale__main__
moduł dla Pythona nie jest skompilowany
Python i PHP są wpisywane dynamicznie, a Java statycznie - czy to jest powód, dla którego Java jest szybsza, a jeśli tak, proszę wyjaśnić, jak to wpływa na szybkość.
I nawet jeśli argument dynamiczny kontra statyczny jest poprawny, nie wyjaśnia to, dlaczego PHP jest wolniejszy niż Python - ponieważ oba są dynamicznymi językami.
java
php
python
language-design
treecoder
źródło
źródło
Odpowiedzi:
Kod JVM może być efektywnie skompilowany w JIT przy użyciu trywialnego (i szybkiego) kompilatora ad hoc. Ale to samo byłoby wyjątkowo trudne dla PHP i Pythona, ze względu na ich dynamicznie wpisywaną naturę. JVM tłumaczy na dość niski poziom i prosty kod natywny, całkiem podobny do tego, co produkowałby kompilator C ++, ale dla języków dynamicznych trzeba by było generować dynamiczne wysyłanie dla dosłownie wszystkich podstawowych operacji i wszystkich wywołań metod. Ta dynamiczna wysyłka jest głównym wąskim gardłem we wszystkich językach tego rodzaju.
W niektórych przypadkach możliwe jest wyeliminowanie dynamicznej wysyłki (jak również wirtualnych wywołań w Javie) przy użyciu znacznie bardziej skomplikowanego kompilatora śledzenia JIT. To podejście jest jeszcze w powijakach, nie robi zbyt wiele abstrakcyjnej interpretacji, a taki kompilator prawdopodobnie dusi się podczas
eval
połączeń (które są bardzo typowe dla języków dynamicznych).Jeśli chodzi o różnicę między Pythonem a PHP, ta ostatnia ma tylko znacznie niższą jakość. Teoretycznie może działać szybciej, ale nigdy nie będzie.
źródło
eval
wywołaniu.Istnieje ogólny problem z tym pytaniem, ponieważ jest ono zbyt absolutne. Nie ma sensu mówić, że „język X jest szybszy niż język Y”. Sam język komputera nie jest „szybki” ani „wolny”, ponieważ jest jedynie sposobem wyrażenia algorytmu. Rzeczywiste pytanie powinno brzmieć w kolejności „dlaczego implementacja X1 języka X jest szybsza niż implementacja Y1 języka Y dla tej konkretnej dziedziny problemowej?”
Niektóre różnice prędkości z pewnością wypadną z samego języka, ponieważ niektóre języki są łatwiejsze do wdrożenia w niektórych domenach niż inne. Ale większość tego, co sprawia, że wdrożenie jest szybkie, nie jest językiem. Na przykład tak naprawdę nie można powiedzieć „Python jest wolniejszy niż Java” bez zastanowienia się, czy mówimy o CPython, IronPython czy PyPy. Jest to szczególnie prawdziwe w przypadku języków korzystających z maszyny wirtualnej, ponieważ na jej szybkość bezpośrednio wpłynie jakość maszyny wirtualnej.
Nawiasem mówiąc, pracuję z systemem, który z różnych powodów nie może używać JIT na naszym urządzeniu z bardzo popularną maszyną wirtualną JavaScript, która normalnie go obsługuje. Oznacza to, że nasz JavaScript działa znacznie, znacznie wolniej niż na komputerze PC z podobnym procesorem. Ta jedna zmiana, która nie jest bezpośrednio związana z samym językiem, powoduje, że JavaScript staje się „kilka razy wolniejszy niż C ++” do bycia „rzędami wielkości wolniejszymi niż C ++” w przypadku zadań, na których nam zależy.
Należy również wziąć pod uwagę fakt, że języki różnią się cechami wydajności w sposób, który nie jest bezpośrednio porównywalny. Zbyt wiele testów porównawczych po prostu tłumaczy program z języka A na język B i nie bierze pod uwagę, że języki różnią się tym, które funkcje są szybkie. (Możesz to zobaczyć w każdym rozsądnym porównaniu porównawczym, takim jak te, do których prowadzisz link, ponieważ często zawierają notatki typu „dzięki tak-a-tak za pokazanie mi, jak zaimplementować to w języku Foo.)
Na przykład weź ten kod Java:
Kuszące byłoby „przepisanie” tego w C ++ i porównanie czasów wykonywania:
Chodzi o to, że każdy kompetentny programista C ++ od razu zobaczy, że w C ++ nie jest to najszybszy sposób na zrobienie czegoś. Możesz łatwo przyspieszyć, zmieniając go, aby był bardziej odpowiedni dla C ++:
Nie chodzi o to, że C ++ może być szybki, ale pisanie testów porównawczych w językach jest naprawdę bardzo trudne. Aby zrobić to odpowiednio, musisz być ekspertem w obu językach i pisać od zera w obu językach. Nawet wtedy możesz łatwo natknąć się na obszary, w których jeden język wyróżnia się w określonym zadaniu. Na przykład mogę napisać wersję Towers of Hanoi w C ++, która będzie działać szybciej niż Java na dowolnym rozsądnym kompilatorze. Mogę to zrobić, zasadniczo oszukując, używając szablonów C ++, ocenianych w czasie kompilacji (http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)
Nie chodzi o to, że mógłbym powiedzieć, że „C ++ jest szybszy niż Java”, ponieważ mój program powrócił natychmiast, podczas gdy wersja Java działała przez kilka minut (i mam nadzieję, że nikt nie zauważył, że budowa mojego programu zajęła pół godziny.) Chodzi o to, że różnią się wąskimi literami, C ++ jest szybszy. W innych wąskich przypadkach może być na odwrót. Nie jest to więc „C ++ jest szybszy”, to „C ++ jest szybszy w przypadkach, w których można ocenić wyrażenie w czasie kompilacji za pomocą szablonów”. Mniej satysfakcjonujące, ale prawdziwe.
Różnice prędkości w językach dotyczą głównie implementacji. Języki skompilowane będą szybsze niż języki interpretowane. Kompilacja do kodu natywnego będzie szybsza niż kompilacja do kodu bajtowego. Będzie to miało o wiele większy efekt niż pytania, czy język jest wpisywany statycznie, czy nie. I oczywiście dobre wdrożenia będą szybsze niż złe.
I nie zapominaj, że dobrzy programiści będą produkować szybszy kod niż źli programiści, często w stopniu znacznie przewyższającym różnice językowe.
źródło
Ma to związek z jakością kompilatora, kompilator Java jest ciągle optymalizowany o wiele dłużej, a optymalizacja jest ważniejsza, ponieważ cały kod jest kompilowany dla Javy. Nie jestem pewien dokładnego powodu, dla którego Python jest szybszy niż PHP, ale postawiłbym się na to z powodu wpływu Google na Python.
źródło
Dlaczego Java jest najszybsza:
Statycznie wpisana flaga + Kompilacja JIT + --server do agresywnej rekompilacji działającego kodu.
Dlaczego Python jest szybszy niż PHP:
Python może być językiem dynamicznym, ale nadal jest mocno napisany. Oznacza to, że struktury, które kodujesz, są w stanie zoptymalizować środowisko wykonawcze.
Dlaczego PHP jest do bani:
Jest to w zasadzie javascript na serwerze (brak obsługi wielowątkowości, całkowicie dynamiczny, luźno wpisany).
Zasadniczo, im więcej kompilator wie o twoim kodzie, tym bardziej może go zoptymalizować. Java jest w pełni optymalizowana przed uruchomieniem i podczas działania. Python można optymalizować podczas działania, a PHP jest, no cóż, okropny. Facebook faktycznie przenosi ich PHP do C, zanim trafi na serwer.
https://developers.facebook.com/blog/post/2010/02/02/hiphop-for-php--move-fast/
źródło
Testy porównawcze są raczej wypaczone na korzyść ciężkiego programowania matematycznego.
Nic dziwnego, że Python jest całkiem dobry w złożonej matematyce, jeśli wziąć pod uwagę, gdzie i dlaczego został napisany po raz pierwszy .
Z drugiej strony PHP zostało napisane, by obsługiwać strony internetowe, może robić inne rzeczy, ale strony internetowe są najlepsze w tym zadaniu i lepsze niż Java.
źródło