Szybkość języków programowania

0

O co chodzi z tą szybkością języków programowania, bo podobno taka java jest strasznie wolna. Dlaczego java jest wolniejsza np. od C#, a zwłaszcza C++.Od czego zależy szybkość danego języka?
Czy jeśli Mortal Kombat na Androida się długo wczytuje to wina tego, że był robiony w Javie? Bo czasem to i z 2-3 minuty mi się włącza.

Ja głównie programuje w Pythonie i czy jest to szybki język?

2

Zaraz po C jest Rust, nie wiem czemu autor go nie dodał.
https://bulldogjob.pl/news/232-ktory-jezyk-programowania-jest-najszybszy

3

To wszystko zależy od tego jak piszesz, niezależnie od języka można coś "popsuć" i będzie działać wolno.

Jak chcesz żeby działało najszybciej to schodzisz "coraz niżej" w poziomie języków np. Python -> C -> Assembly -> microcode. Ale często napisanie jakiejś prostej rzeczy w języku "wyżej" zajmie N czasu mniej - dlatego w większości przypadków nie warto zwracać na to uwagi, chyba, że piszesz dla Google ew. jakiejś wielkiej korpo gdzie oszczędność na poziomie kilku ms przykłada się na dużo $$$.

9

Język służy do pisania kodu, nie do jego wykonania, dlatego też nie można mówić, że dany język jest szybki lub nie. To nie język jest szybki, a program, który na jego podstawie zostanie wygenerowany (z wyłączeniem stricte skryptowych).

Szybkość danego kodu zależy od wielu rzeczy, np. sposobu jego wykonania, od kompilatora/interpretera, który ten kod przygotowuje do działania (czyli kompiluje i coś wypluwa lub interpretuje w locie), użytych optymalizacji oraz od samej jego ogólnie rozumianej jakości.

0

Piszmy strony internetowe w C! Wreszcie będą się szybko wczytywać!

11

A. "C# is much faster than C++"
B. "It cannot be true"
A. "Sure it can"
B. "By how much?"
A. "Usually by 2-3 months"

0

(W poście zakładam, że programista pisze program w jak najbardziej optymalny sposób).

Podejrzyj sobie jakiś plik exe. Składa się on z poszczególnych instrukcji procesora. Tworząc program w taki sposób, wykona się on najszybciej. Procesor ma do wykonania konkretne instrukcje bez zbędnych zadań.

Następnie masz assemblery, które są taką bardziej ludzką postacią kodu maszynowego (czyli execa). Masz już tu konkretne polecenia. Program jednak musi zostać skompilowany do kodu maszynowego, a podczas procesu kompilacji może powstać jakiś nadmiarowy kod. Czyli program napisany w assemblerze może być nieco wolniejszy niż ten napisany w kodzie maszynowym, ponieważ może mieć do wykonania nieco więcej operacji.

Oczywiście nikt normalnie nie pisze ani w kodzie maszynowym, ani w assemblerze gotowych programów (poza specyficznymi branżami).

Dalej mamy inne natywne języki, np. C, C++, Delphi, Python (?). Te języki są już dużo bardziej zrozumiałe dla człowieka. Posługują się też bezpośrednio mechanizmami systemu operacyjnego. Jednak podczas procesu kompilacji tworzy się więcej nadmiarowego kodu niż przy kompilacji assemblera. Dlatego też programy pisane w tych językach będą wolniejsze od programów pisanych w assemblerze.

Dalej mamy języki wysokiego poziomu, np.: C#, Java. Te języki są kompilowane do kodu pośredniego. Kod pośredni nie jest wykonywany przez procesor (jak w przypadku języków niskiego poziomu), tylko interpretowany przez specjalne oprogramowanie (Wirtualna Maszyna Javy - JVM, czy też CLR dla .NET). I przez tą warstwę pośrednią taki program wykona się najwolniej. Jednak programy w językach wysokiego poziomu pisze się najszybciej.

Oczywiście to jeszcze zależy od wersji, rodzaju interpretera, kompilatora itd. Niemniej jednak tak to wygląda w teorii. W praktyce możliwe jest napisanie programu w C i w C# w taki sposób, że ten w C# będzie szybszy :)

2

@Juhas: trochę mitów tam jest ;) Tak było moze kiedyś, ale dziś trzeba brać pod uwagę jeszcze optymalizacje

  1. Napisanie kodu lepszego od tego co wygeneruje kompilator jest trudne, bo kompilator stosuje kupę "sztuczek". W efekcie nie liczyłbym na to że napiszesz w asmie coś lepszego niż wygeneruje ci kompilator C.
  2. W językach z maszynami wirtualnymi dochodzi JIT i optymalizacja kodu w runtime, która może sprawić że kod będzie szybszy niż natywny. Trywialny przyklad: w kodzie robisz gdzieś mnożenie x*y. Nie da się tego specjalnie zoptymalizować, więc wygeneruje się z tego jakis mul. Ale może w runtime y=2 i zamiast mnożenia można zrobić przesnięcie bitowe? W binarce skompilowanej nic się już z tym nie zrobi, masz tam w asemblerze mul i tyle. W języku z maszyną wirtualną i JITem sytuacja wygląda inaczej, bo tam takie coś można zoptymalizować w czasie wykonania :)
0

@Shalom: celowo napisałem na początku o optymalnym pisaniu kodu :) To jest założenie, bez którego się nie obejdzie. Nie pisałem o optymalizacjach kompilatorów, żeby nie zaciemniać. No i jasne, że poszczególne instrukcje mogą być szybsze w wysokim poziomie. Jednak ja miałem na myśli całą użyteczną aplikację ;)

0

O co chodzi z tą szybkością języków programowania, bo podobno taka java jest strasznie wolna.

A czym to jest podparte? Zwykle tacy mędrcy co narzekają na szybkość Javy albo pamiętają ładowanie apletów Javy na Pentium 133 MHz z 16 MiB RAM albo testują szybkość unboxingu sumując Listę dużych Integerów. Swego czasu zrobiłem mały benchmark, ale bardziej sensowny niż te typowe. Mierzę wydajność czystego kodu w C, Javie, Pythonie, JavaScript etc podczas gdy mikrobenchmarki często testują wydajność funkcji wbudowanych w język jak np sortowanie kolekcji w Pythonie, które jest zakodowane w C czy np regexy, które też są pisane często w C mimo, że odpalane z innego języka.

Porównanie wydajności jest tutaj: https://github.com/tarsa/TarsaLZP

0
Wibowit napisał(a):

O co chodzi z tą szybkością języków programowania, bo podobno taka java jest strasznie wolna.

A czym to jest podparte? Zwykle tacy mędrcy co narzekają na szybkość Javy albo pamiętają ładowanie apletów Javy na Pentium 133 MHz z 16 MiB RAM albo testują szybkość unboxingu sumując Listę dużych Integerów. Swego czasu zrobiłem mały benchmark, ale bardziej sensowny niż te typowe. Mierzę wydajność czystego kodu w C, Javie, Pythonie, JavaScript etc podczas gdy mikrobenchmarki często testują wydajność funkcji wbudowanych w język jak np sortowanie kolekcji w Pythonie, które jest zakodowane w C czy np regexy, które też są pisane często w C mimo, że odpalane z innego języka.

Porównanie wydajności jest tutaj: https://github.com/tarsa/TarsaLZP

Czy dobrze zrozumiałem, z Twojego posta, że np. interpreter Pythona testujesz nie używając go skompilowanego w C do binarki, tylko w jakiś inny, tajemny sposób, który przekłada Python bezpośrednio na rozkazy dla procesora?

1

Nie. Chodzi mi np o to, że w Pythonie kolekcje, regexy i wiele innych rzeczy jest zaimplementowane w C. Natomiast w Javie kolekcje, regexy i w ogóle prawie wszystko jest zaimplementowane w czystej Javie.

Dla przykładu dictionary z CPythona: https://github.com/python/cpython/blob/master/Objects/dictobject.c
HashMapa z Javy: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashMap.java

Jeżeli mierzysz szybkość Pythona wykorzystując głównie (mierząc czasem procesora) funkcje napisane w czystym C to tak naprawdę mierzysz wydajność kodu w C. Jeśli chcesz utrzymać tą wydajność to dla każdego zadania, które chcesz zakodować w Pythonie będziesz musiał szukać biblioteki napisanej w C z bindingami do Pythona.

Edit:
Chociaż z regexami w Pythonie nie jestem pewien. Natomiast w JavaScript (konkretnie silnik Chrome'a czyli V8) regexpy są już obsługiwane przez kod w C: https://v8project.blogspot.co.uk/2017/01/speeding-up-v8-regular-expressions.html

2

O co chodzi z tą szybkością języków programowania

chodzi o robienie flame

bo podobno taka java jest strasznie wolna.

przelezales pod lodem pol wieku?

Dlaczego java jest wolniejsza np. od C#, a zwłaszcza C++.

nie jest

Od czego zależy szybkość danego języka?

od programisty

Czy jeśli Mortal Kombat na Androida się długo wczytuje to wina tego, że był robiony w Javie? Bo czasem to i z 2-3 minuty mi się włącza.

slaby sprzet :)

Ja głównie programuje w Pythonie i czy jest to szybki język?

chyba my ciebie powinnismy spytac

0

http://benchmarksgame.alioth.debian.org

Tutaj można popatrzeć.

3
Morgotheron napisał(a):

O co chodzi z tą szybkością języków programowania, bo podobno taka java jest strasznie wolna. Dlaczego java jest wolniejsza np. od C#, a zwłaszcza C++.Od czego zależy szybkość danego języka?

Zakładając że jednak nie chodzi o flejm.

  1. Dlaczego Java może być wolniejsza od C#?
    Nie testowałem, ale może być wolniejsza przez brak standardowych kolekcji opartych o primitywy (wartości liczbowe nie będące obiektami).
    Z tego co wiem w C# to jest. Na dzień dzisiejszy można wybrać między niestandardowymi kolekcjami, strumieniami (np. IntStream) a kolekcjami z autoboxingiem (ArrayList). Pozostaje czekać na Valhale.

  2. Dlaczego Java może być wolniejsza od C/C++?
    C/C++ ma aktualne z tego co wiem lepszą wektoryzację kodu i lepiej zarządzane przetwarzanie wielowątkowe (patrz OpenMP i schedule + reduction).
    W C/C++ masz większą kontrolę nad tym jak są dane ułożone w cache.
    W C/C++ możesz zaalokować obiekt na stosie, przez co jego zwolnienie (czy całej tablicy takich obiektów) to jedna instrukcja procesora.
    W C/C++ masz nieograniczone wsparcie dla SIMD, co widać właśnie w cytowanych tu benchmarkach językowych.

0
Czarny Rycerz napisał(a):

http://benchmarksgame.alioth.debian.org

Tutaj można popatrzeć.

No na tych benchmarkach widać tę wadę o której wspomniałem. Jeśli porównamy Node.js do Javy to wychodzi na to, że we wszystkich benchmarkach oprócz jednego Java ma przewagę, zwykle bardzo dużą (kilkukrotną): https://benchmarksgame.alioth.debian.org/u64q/javascript.html Jedyny benchmark, w którym Node.js wygrywa z Javą to 'regex-redux'. Jak już wcześniej wspomniałem regexpy w Node.js są zaimplementowane w czystym C, więc ten benchmark to w rzeczywistości porównanie wydajności C vs Java, a nie JavaScript vs Java.

Mikrobenchmarki nie mają też zupełnie sensu jeśli chcemy zmierzyć przydatność języków do korpo-projektów. Wydajność w korpo projektach leży nie dlatego, że interpreter czy VMka jest wolna tylko dlatego, że kod zamiast być ciągle poprawiany jest zostawiany w katastrofalnym stanie. Dla przykładu ktoś robi 100 zapytań do bazy danych podczas gdy 3 zapytania by spokojnie wystarczyły, ale refaktor kodu jest na tyle upierdliwy (np trzeba zmienić 100 plików z kodem źródłowym) że nikomu się nie chce. Java to jeden z języków, w którym kod się świetnie refaktoruje (także dzięki wypasionym narzędziom takim jak IntelliJ IDEA) w celu poprawienia wydajności przy zmieniającym się obciążeniu systemu.

2
Wibowit napisał(a):

Jedyny benchmark, w którym Node.js wygrywa z Javą to 'regex-redux'. Jak już wcześniej wspomniałem regexpy w Node.js są zaimplementowane w czystym C, więc ten benchmark to w rzeczywistości porównanie wydajności C vs Java, a nie JavaScript vs Java.

Przeceniasz różnice językowe, nie doceniasz różnic w zastosowanym algorytmie. Node.js używa automatu (https://github.com/ashinn/irregex), podczas gdy java używa algorytmu z nawrotami. Dla odpowiedniego wzorca to drugie podejście może mieć złożoność wykładnicza, podczas gdy automat zawsze ograniczy się w czasie wielomianowym. Wystarczy, że wzorce będą odpowiednio długie i zawierały operator | i algorytm z nawrotami zacznie wysiadać.

0

Wydaje mi się, że zyskują z roku na rok proste języki programowania w których się szybko pisze(błyskawicznie wręcz - programowanie z prędkością myśli) takie jak Python. Ponieważ czas programisty teraz jest najważniejszy, oraz jak najszybsze napisanie aplikacji, programu, a zasoby komputera schodzą na drugi plan. Wydajność komputera się szybko zwiększa, a podzespoły są coraz tańsze. Sam Python nie misi być wolny, jest przecież Numba
numba.pydata.org/
Warto poznać Pythona, czy Ruby, Elixir.
flynerd.pl/2017/06/10-powodow-dla-ktorych-warto-nauczyc-sie-pythona.html

0
Wibowit napisał(a):

Nie. Chodzi mi np o to, że w Pythonie kolekcje, regexy i wiele innych rzeczy jest zaimplementowane w C. Natomiast w Javie kolekcje, regexy i w ogóle prawie wszystko jest zaimplementowane w czystej Javie.

Dla przykładu dictionary z CPythona: https://github.com/python/cpython/blob/master/Objects/dictobject.c
HashMapa z Javy: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashMap.java

Jeżeli mierzysz szybkość Pythona wykorzystując głównie (mierząc czasem procesora) funkcje napisane w czystym C to tak naprawdę mierzysz wydajność kodu w C. Jeśli chcesz utrzymać tą wydajność to dla każdego zadania, które chcesz zakodować w Pythonie będziesz musiał szukać biblioteki napisanej w C z bindingami do Pythona.

Edit:
Chociaż z regexami w Pythonie nie jestem pewien. Natomiast w JavaScript (konkretnie silnik Chrome'a czyli V8) regexpy są już obsługiwane przez kod w C: https://v8project.blogspot.co.uk/2017/01/speeding-up-v8-regular-expressions.html

O ile mi wiadomo, to np. interpreter CPython w większości jest napisany w C więc tutaj pytam: co w takim przypadku nie jest zaimplementowane w C mając to na względzie?

1

O ile mi wiadomo, to np. interpreter CPython w większości jest napisany w C więc tutaj pytam: co w takim przypadku nie jest zaimplementowane w C mając to na względzie?

A odróżniasz funkcje biblioteczne od interpretera/ VMki? Interpreter i VMka Javy są napisane w C++, ale kolekcje w Javie (funkcje biblioteczne) są napisane w Javie.

Wydaje mi się, że zyskują z roku na rok proste języki programowania w których się szybko pisze(błyskawicznie wręcz - programowanie z prędkością myśli) takie jak Python. Ponieważ czas programisty teraz jest najważniejszy, oraz jak najszybsze napisanie aplikacji, programu, a zasoby komputera schodzą na drugi plan. Wydajność komputera się szybko zwiększa, a podzespoły są coraz tańsze. Sam Python nie misi być wolny

Kod źródłowy Pythona jest write-only. Refaktor złożonego kodu kaczo-typowanego działa słabo. Gdyby statyczna analiza kodu działała w Pythonie tak samo dobrze jak w Javie i C#, to Python już dawno wyparłby Javę i C# z większości korpo projektów. Python za to świetnie się sprawdza przy skryptach, małych aplikacjach i ogólnie jako glue code.

Musisz wziąć pod uwagę to, że korpo-rzeczywistość jest zupełnie różna od hello worldów, które klepiesz przy okazji nauki nowego języka. W Pythonie bardzo szybko można prototypować niezależną aplikację, ale rzadko kiedy w korpo coś takiego robisz. Typowe zadanie w korpo polega na przegrzebaniu się przez system o rozmiarze liczonym w setkach tysięcy linii kodu, którego nikt w 100% nie ogarnia (dlatego koledzy z zespołu muszą się nieustannie wspierać - każdy zna coś innego, więc pomoże z tym) i przeoraniu go tak, by zmusić go do obsługi nowego bajeru mimo iż nie był on zaprojektowany by ten nowy bajer obsługiwać (zasada YAGNI). Bez solidnego wsparcia od IDE, które automatyzuje nawigację, refaktor, analizę kodu (np hierarchie dziedziczenia), wyłapuje błędy na bieżąco, podpowiada składnię, itp itd ciężko funkcjonować w projektach o takiej skali.

Jak szybko trzeba klepać kod, żeby naklepać milion linii kodu? Załóżmy, że w projekcie pracuje średnio 10 programistów, a projekt ma 10 lat. Każdy pracuje 200 dni w roku i klepie 5 godzin dziennie. Daje to 100 tysięcy roboczogodzin. By naklepać milion linii kodu w takim czasie każdy programista musi dodawać średnio 10 linii kodu na roboczogodzinę. Do tego dochodzi jeszcze refaktor kodu już istniejącego, więc tak naprawdę zmienionych linii kodu musi być powiedzmy 20 na godzinę. W rzeczywistości tempo jest chyba mniejsze, ale i tak naklepanie miliona linii kodu w jednym zespole (wliczając rotację zatrudnienia, bo rzadko kiedy ludzie wytrzymują w projekcie 10 lat) to nie jest jakiś nieosiągalny wyczyn.

1 użytkowników online, w tym zalogowanych: 0, gości: 1