Kategorie: Programowanie

Porównanie szybkości kilku języków programowania

Cześć! Cieszę się, że mnie odwiedziłeś/aś. Zanim przejdziesz do artykułu chciałbym zwrocić Ci uwagę na to, że ten artykuł był pisany kilka lat temu (2013-03-09) miej więc proszę na uwadzę że rozwiązania i przemyślenia które tu znajdziesz nie muszą być aktualne. Niemniej jednak zachęcam do przeczytania.

Cześć.

Jakiś czas temu, gdy zaczynałem pisać pierwsze „Heloł łordy” zastanawiałem się który z tych wszystkich języków, jest najszybszy. Bo chyba własnie o szybkość pisania kodu/działania programu tu chodzi.

Teraz mam wystarczająco skilla żeby móc zmierzyć szybkość kilku języków implementując w nich ten sam algorytm w ten sam sposób. Prawie ten sam sposób. I zobaczyc na własne oczy.

Test ten przeprowadzę na kilku językach:

  • PHP

Język do tworzenia stron WWW. Interpretowany. Można wykorzystwać go do pisania aplikacji okienkowych, ale jest to dość rzadka praktyka.

  • Python

Ciekawy, interpretowany język programowania. Jego filozofią jest czytelność i przejrzystość kodu poprzez wymuszanie wcięć, które służą jako oznaczenia bloków kodu. Pojawił się w 91 roku, popularność zdobył zdecydowanie później.

  • LUA

Jedyny język z tych przedstawionych przeze mnie gdzie indeksowanie tablic zaczyna się od 1 a nie od 0. Filozofią LUA jest „prostota, wydajność i przenośność kodu”.

  • Java

Java :) jezyk programowania ogólnego przeznaczenia, wieloplatformowy. Uzywa swojej maszyny wirtualnej i dzięki temu może byc odpalony na każdym systemie który ma Javę zainstalowaną. W pełni obiektowy.

  • C++

Klasyka.

  • C

Klasyka klasyki :)

  • Java Script

Język który służy przede wszystkim do tworzenia stron WWW. W przeciwieństwie od PHP jest wykonywany po stronie użytkownika a nie po stronie serwera.

 

Ok. Tyle słowem wstępu. Algorytmem którego czas wykonywania się będziemy mierzyć jest Sito Eratostenesa. Czemu ten algorytm? Ponieważ jest prosty w implementacji, dość praktyczny i złożonośc obliczeniona szałowa nie jest. Służy on do wyszukiwania liczb pierwszysch z przedziału

Nasze n = 100000

 

Czyli nasze programy będą szukały wszystkich liczb pierwszych z zakresu .

 

Ok, przedstawię listingi wraz z ilością znaków i linii.
PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
<?
$n=100000;
for($i=0;$i<$n+1;$i++) $d[$i]=$i;

for($a=2;$a<=$n+1;$a++)
{
for ($b=2*$a;$b<=$n+1;$b=$b+$a)
{
  $d[$b]=0;

}
}
?>

PHP kończy się na 13 liniach i 112 znakach bez spacji.
Python

1
2
3
4
5
n =100000
e= range(2, n+1)
for x in range(2, n+1):
for t in range(x+x,n+1, x):
  e[t-2]=0

Python to tylko.. 5 linii i 72 znaki.
LUA

1
2
3
4
5
6
7
8
9
10
n=100000
digits = {}
for i=2,n do
digits[i-1]=i
end
for i=2,n do
for t=i+i,n, i do
  digits[t-1]=-1
end
end

Lua to 10 linii i 87 znaków.
Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) {
int n=100000;
boolean pierwsze[] = new boolean[n];
Arrays.fill(pierwsze, true);
pierwsze[0]=false;
pierwsze[1]=false;
for(int i=2;i<=n;i++)
{

for(int t=i+i;t<n;t=t+i)
{

  pierwsze[t]=false;

}

}

}

19 linii i 208 znaków.
C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
bool* firsts=NULL;
int n =100000;
firsts = new bool[n];
int i;
for( i=0;i<n;i++)
firsts[i]=true;
for(i=2;i<=n;i++){

for(int a=2*i;a<=n;a=a+i)

  firsts[a]=false;

}
delete[] firsts;
return 0;
}

20 linii i 229 znaków.
C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main(){
int* firsts;
int n =100000;
firsts = (int*)malloc(n*sizeof(int));
int i,a;

for( i=0;i<n;i++)
firsts[i]=1;

for(i=2;i<=n;i++){

for( a=2*i;a<=n;a=a+i)
  firsts[a]=0;

}
free( firsts);
return 0;
}

19 linii i 194 znaki.
JavaScript

1
2
3
4
5
6
7
8
9
10
11
12
13
var n=100000;
var d = new Array()
for (var a = 2; a<n+1; a++) {
d[a-2]=a
}
for (var i = 2; i <= n+1; i++)
{

for (var a = 2*i; a<=n+1; a=a+i)
{
  d[a-2]=0
}
}

13 linii kodu i 118 znaków.

Ok. Kilka spraw organizacyjnych.
Cpp – kompilator g++ na win 7.
c- kompilator gcc na win 7.
Python – wersja 2.7
LUA – wersja 5.1.4
PHP – werjsa 5.2
JavaScript – na przeglądarce Google Chrome.
Java – wer. 7, NetBeans.
Mój komputer to HP 1,8GHz Core 2 Duo. 2 GB pamięci RAM. No i na nim Win 7.

Co dokładnie mierzyłem i w jaki sposób?
Mierzyłem samo wyszukiwanie liczb pierwszych bez wstepnego zapełniania tablicy czy zwalniania pamieci jak w przypadku C/Cpp. Mierzyłem czas ogólno dostępnymi funkcjami czyli np. dla PHP to funkcja microtime() a dla C to clock().

Wyniki badania sprowadziłem do jednej jednostki – milisekund.
Spójrzmy na wyniki…

Nr próbki 1 2 3 4 5 Średnia
PHP 210 160 240 200 190 200 [miliseconds]
Python 783 695 962 709 714 772,6 [miliseconds]
LUA 246,01 244,01 249,01 243,02 231 242,61 [miliseconds]
Java 9 9,5 8,7 9,3 9,8 9,26 [miliseconds]
Cpp 15 16 31 16 15 18,6 [miliseconds]
C 13 12 9 12 11 11,4 [miliseconds]
JavaScript 36 35 34 41 37 36,6 [miliseconds]

Co w przełożeniu na wykres wygląda tak:

Uff, co się okazuje? Ano okazuje się że nie możemy mieć wszystkiego. Python jako język który miał najmniejszą ilość linii i znaków okazał się najwolniejszy. LUA, prawie 3 krotnie szybsza jest od Pythona a różnica w ilości linii znikoma.

Zobaczmy dokładnie jak przedstawia się ilość linii do szybkosci:

Średnia Linii
PHP 200 13
Python 772,6 5
LUA 242,61 10
Java 9,26 19
Cpp 18,6 20
C 11,4 19
JavaScript 36,6 13

Uzupełnijmy tabelę o kolumnę która będzie stworzona z podzielenia średniego czasu przez ilość linii:

 

Średnia Linii Średnia / Ilość linii
PHP 200 13 15,38461538
Python 772,6 5 154,52
LUA 242,61 10 24,261
Java 9,26 19 0,487368421
Cpp 18,6 20 0,93
C 11,4 19 0,6
JavaScript 36,6 13 2,815384615

 

Wspólczynnik który stworzyliśmy powinien być jak najmniejszy. Sortując wg niego, otrzymujemy:

  • Java
  • C
  • C++
  • JavaScript
  • PHP
  • LUA
  • Python

Co z tego wynika? Chociażby to że warto pisać w Javie ;) A tak serio, bardzo blisko Javy jest C i C++ – nie bedzie powodu one się tam znalazły. To jedne z szybszych języków jakie istnieją. Czemu tutaj Java okazała się szybsza? Bo mimo wszystko ona się dalej rozwija i twierdzenie że jest baaardzooo wooolnaaaa powoli, powoli.. Staje się nieaktualne. Nie twierdzę że jest super szybka, ale dodając do wyników fakt przenośności kodu, pełną obiektowość i multum klas dostępnych w Internecie – stawia Jave dość wysokow. PHP, LUA, Python – wielcy przegrani. Mimo że każdy z tych języków jest dobrym językiem (PHP dobre moge nazwać od wersji 5) to tracą na szybkosci przez interpretowany charakter. LUA jest średnio popularnym językiem, PHP się używa do stron, a co do Pythona.. Mimo tego że wolny, to nadal warty uwagi, chociażby na słynne 5 linii :)

Warto wspomnieć – test nie jest jakoś bardzo miarodajny – różnych języków używa się do różnych zastosowań. Zbadanie jednego alogrytmu nie powinno określać całej efektywności danego języka.

Pozdrawiam!

Dzięki za wizytę,
Mateusz Mazurek
Mateusz M.

Pokaż komentarze

  • Oto moi kochani dowód na to, że Python jest zły. Może pisze się w nim szybko, ale płaci się za to bardzo wysoką cenę - przetwarzanie jest niezwykle wolne. Jest to także pochwała dla Javy, po której nie spodziewałem się takiej szybkości :)

  • Mozesz mi wytlumaczyc dlaczego w kodzie C++ wlaczales pliki naglowkowe z ktorych w ogole nie korzystales??? Nie wspominajac o przestrzenii nazw.

    Nie rozumiem tez dlaczego mimo zamilowania do zbednych linijek w kodzie programu C pominales headersa skoro malloc wedlug dokumentacji ANSI C nalezy do tej biblioteki?????

  • Kolego, bo Ci się klawiatura od "?" spali :P a dlaczego napisałem to tak jak napisałem - ponieważ przestrzeń nazw jest generowana automatycznie wraz z dołączeniem tych bibliotek przez popularne IDE pod Windowsem :)

    PS. Biedny Shift..

  • Porównanie tak mało miarodajne jak proste. Ja jednak trochę się zgadzam z wpisem o liniach i nagłówku. Jeśli chcesz liczyć ilość linii - usuń zbędne, bo tak wygląda jakby test był pisany specjalnie pod konkretny język :-) . Innych rzeczy nie ma co się czepiać, bo zawsze takie są.

  • test średni właśnie robię własny szkoda, że nie dałeś c# bo widzę, że niszczy pozostałe języki szybkością, a java na poziomie c++ ale jak np zrobisz dużą macierz i do niej będziesz dopisywał wyniki i macierz nie będzie boolami tylko np intami to java już 2x słabiej od c++ a python wiadomo dno z szybkością

  • Nie zgodzę się z tym co zostało to przedstawione. Nie wierzę, że java jest szybsza od c++. Powiedzmy szczerze java nigdy nie będzie szybsza. Maszyna wirtualna jest programem stworzonym językiem kompilowanym, przez co już na tym etapie jest ograniczona jego prędkością. Proces wykonywania bytecodu jest bardzo skomplikowany i powolny. Natomiast program kompilowany wykonywany jest prosto plik->procesor, bez pośredników. Zapewne zawiniła metoda pomiaru ( albo jeszcze coś innego ). Nikt nie wciśnie mi, że java jest superszybka. W testach googla wypadła około 3.3 raza gorzej niż c++. Żaden język programowania nie jest idealny, a już w szczególności java. Trzeba być ślepo w niej zakochany, żeby to pisać. Co do kodu c++ to do niczego się on nie nadaje! Jestem ciekaw kto to pisał. Moja wersja kodu:

    int main()
    {
    const int n = 100000;
    bool* firsts = new bool[n];
    for ( int i = 0; i < n; i++ )
    firsts[i] = true;
    for ( int i = 2; i <= n; i++ )
    for ( int j = 2*i; j <= n; j=j+i )
    firsts[j] = false;
    delete [] firsts;
    return 0;
    }

    Kompiluje się i działa tak samo. Poza tym, czy Mateusz M. na pewno wie co to są przestrzenie nazw ( po ostatnim komentarzu tego nie widać ). Przepraszam za ostry komentarz, ale nie pozwolę obrażać c ;)

  • Łał, co za pocisk Dawidzie :D Raczej w tym artykule nie napisałem nigdzie ze Java jest szybsza, a tylko tyle że wyszła szybciej w moim teście ;) to spora różnica :D gdyż nie sądzę że jest szybsza. I C również nigdzie nie obrażałem :P o i wiem czym są przestrzenie nazw jak dostałem Twój komentarz na maila jako powiadomienie to aż się uśmiechnąłem czytając go.

    Wszystko co piszesz o procesie kompilacji Javy jest prawdą :P

    Test należy brać raczej w kategorii "ciekawostka" niż "nauka" ;) A to czemu Java faktycznie wyszła szybsza - nie wiem. Chętnie posłucham ludzi mądrzejszych

    Pozdrawiam.

    PS. Ogólnie to dzięki za konstruktywny komentarz, bez zbędnych ?!!?!?!?!?1??!!?! :)

  • Może co do prędkości javy trochę przesadziłem. Mam kilka uwag dotyczących tylko kodu. Co do kodu c++:
    1.Po co pierwsze trzy linijki ( inkludowanie nieużywanych bibliotek i przestrzeni nazw, która też nie zostanie użyta )?
    2.Dlaczego ciało drugiej pętli for jest zamknięte w nawiasach, skoro nie musi, a zwiększa "obszerność" kodu?
    3.Dlaczego tworzenie wskaźnika zostało rozbite na dwie części, skoro można go było utworzyć w jednej linijce?
    4.Dlaczego użyte zostały w ogóle wskaźniki?
    A co do javy, to nie trzeba przypadkiem utworzyć głównej klasy?
    Pragnę, również zauważyć, że policzone są również puste linijki kodu, które mogły zostać pominięte i te niepotrzebne. Poza tym wynik w linijkach kodu nie jest bardzo miarodajny. Apkę w c++, o identycznym kodzie można by zapisać w jednej linijce, skompilowałaby się i zadziałała identycznie. Kompilatorowi nie robi różnicy zapis:
    cout
    << cos
    << endl
    << cos2
    << endl;
    i
    cout << cos << endl << cos2 << endl;

  • Co do kodu w C++ to:
    1. Nie usuwałem żadnych bibliotek ani przestrzeni nazw, gdyż testowałem to na "standardowym", nowo utworzonym, projekcie CodeBlocks.
    3 i 4 - z przyzwyczajenia.
    2 - lubię mieć pętle zewnętrzne z klamrami. Puste entery to troszkę moja wina racja, a troszkę tego jak kod interpretuje WP ;)

    Co tam jeszcze.. Aaa i rację masz co do Javy - szkielet klasy głównej powinien być. Linii wyszłoby faktycznie więcej.

    Co do wyliczania współczynnika uzależnionego od linii kodu - to wiedziałem że jest kiepski już podczas pisania tego artykułu, dlatego po raz nty powtarzam:

    ARTYKUŁ TEN NIE JEST WYZNACZNIKIEM REALNEJ SZYBKOŚCI JĘZYKÓW. JEST CIEKAWOSTKĄ.

    Ludzie, spokojnie ;)

  • Uczę się hobbystycznie swojego pierwszego języka programowania - JavaScript i jestem mile zaskoczony takim rankingiem. Po niektórych wpisach w internecie wnioskowałem, że JS to taki g. warty bajer na stronki www, co to ma, niczym tipsy blachary, ładnie wyglądać, ale nic w tym nie ambitnego nie zrobisz. I w ogóle, że to takie przedszkole, a nie programowanie. A tu takie buty - 70 razy szybszy od Pythona :)
    Pozdrawiam!

    • JavaScript przez ostatnie lata bardzo zyskał na popularności ;) już nikogo nie dziwi zawód "Programista JavaScript" i są to całkiem fajne pieniądze :)

Ostatnie wpisy

Podsumowanie: luty i marzec 2024

Ostatnio tygodnie były tak bardzo wypełnione, że nie udało mi się napisać nawet krótkiego podsumowanie. Więc dziś zbiorczo podsumuję luty… Read More

2 tygodnie ago

Podsumowanie: styczeń 2024

Zapraszam na krótkie podsumowanie miesiąca. Książki W styczniu przeczytałem "Homo Deus: Historia jutra". Książka łudząco podoba do wcześniejszej książki tego… Read More

3 miesiące ago

Podsumowanie roku 2023

Cześć! Zapraszam na podsumowanie roku 2023. Książki Zacznijmy od książek. W tym roku cel 35 książek nie został osiągnięty. Niemniej… Read More

3 miesiące ago

Podsumowanie: grudzień 2023

Zapraszam na krótkie podsumowanie miesiąca. Książki W grudniu skończyłem czytać Mein Kampf. Nudna książka. Ciekawsze fragmenty można by było streścić… Read More

4 miesiące ago

Praca zdalna – co z nią dalej?

Cześć, ostatnio w Internecie pojawiło się dużo artykułów, które nie były przychylne pracy zdalnej. Z drugiej strony większość komentarzy pod… Read More

4 miesiące ago

Podsumowanie: listopad 2023

Zapraszam na krótkie podsumowanie miesiąca. Książki W listopadzie dokończyłem cykl "Z mgły zrodzony" Sandersona. Tylko "Stop prawa" mi nie do… Read More

5 miesięcy ago