Dlaczego ludzie nadal twierdzą, że Java działa wolno? [Zamknięte]

61

Przez długi czas w SO i innych miejscach Java ma reputację powolności. Od żartów po wiele komentarzy w pytaniach i odpowiedziach, ludzie wciąż wierzą, że Java działa wolno tylko na podstawie doświadczenia z nią w latach 90.

To mój problem: obaliliśmy (większość) powodów, dla których ludzie uważają, że Java jest powolna. Poza małymi rzeczami Java jest dość szybka.

Dlaczego ludzie wciąż nie chcą wierzyć, że Java jest szybka? Czy to część ich sposobu myślenia, że ​​cokolwiek innego niż C / C ++ jest wolne? Czy to dlatego, że ludzie nie sprawdzają w czasie? Czy to dlatego, że ludzie są po prostu stronniczy?

TheLQ
źródło
10
Umm, C # też jest szybki;)
Evan Plaice,
12
umm, ten link nie obala powolności Java.
13
Mam wrażenie, że Java raczej nie reaguje niż powolnie.
zneak
23
Opuchnięte i okropne biblioteki UI ..?
dmp
4
Ponieważ JVM nie jest częścią jądra. Och, może niektórzy faceci Linuksa dodadzą to w przyszłości.
Xiè Jìléi

Odpowiedzi:

131

To aplikacje. Jak zauważasz, wielokrotnie udowodniliśmy, że w wymyślonych scenariuszach kod Java może sprostać, a nawet pokonać wydajność tak zwanych języków „wykonawczych”, takich jak C, C ++, Lisp, VB6 lub JavaScript. A kiedy otrzymają takie dowody, najbardziej rozsądni, otwarci przeciwnicy zwiesą głowy ze wstydu i obiecają, że nigdy więcej nie będą szerzyć takich oszczerstw.

... ale potem uruchamiają Eclipse, NetBeans, Guiffy lub włączają obsługę Java w przeglądarce lub próbują uruchomić aplikację na swoim ulubionym telefonie z funkcją. I czekają, aż zacznie reagować ...

... i czekaj ...

... i czekaj ...



... i czekaj ...







... i czekaj ...











... i ...




... co obiecałem, że nigdy więcej nie zrobię ? Przepraszam, musiałem zasnąć ...

Shog9
źródło
44
Uruchomienie nawet najprostszego GUI Java zajmuje co najmniej 1,5 sekundy. To nie jest trochę.
Peter Boughton,
32
Nigdy nie myślałem, że Javascript jest uznawany za język „performant”.
zneak
11
+1 za wzmiankę o IDE. Istnieje ogromna różnica między responsywnością Eclipse a IDE, takim jak Visual Studio.
mellowsoon
56
Mam z tym problemy. Firefox jest napisany głównie w C ++ i jest powolny. Czy to oznacza, że ​​C ++ jest wolny? Nie, oznacza to, że Firefox działa wolno. Mówienie, że język jest wolny, ponieważ największy program w nim napisany jest wolny, jest głupie.
TheLQ
13
Jonas, używając najprostszego przykładu, jaki mogę znaleźć, nie czyni mnie złym programistą. Jeśli masz magiczną metodę, która uruchamia graficzny interfejs użytkownika Java w mgnieniu oka, śmiało to zademonstruj .
Peter Boughton,
48

To pytanie działa w fałszywych przesłankach: tam, gdzie się liczy, Java jest nadal wolna. Liczy się algorytmy obciążające obliczenia na dużych zestawach danych. To prawda, że można je zoptymalizować, czasem na równi z kodem C / C ++, ale tylko kosztem modułowości i ogólności. Wydajny kod C ++ można zaprojektować tak, aby był ogólny i użyteczny jako biblioteka ogólnego przeznaczenia. Kod Java nie może. Wystarczy spojrzeć na wysoce zoptymalizowaną Array.sortmetodę, która wykorzystuje różne implementacje dla wszystkich podstawowych typów i której wariant obiektu jest wciąż znacznie wolniejszy niż ogólny C ++, sortponieważ obiekty te muszą dynamicznie wywoływać porównania równości.

To prawda, że ​​optymalizacje w samą porę przeprowadzane przez silnik HotSpot mogą faktycznie przewidzieć cel tych wirtualnych połączeń i podjąć próbę inlinizacji. Jest to jednak wolniejsze niż bezpośrednio wywołane wywołanie, które jest wywoływane w sortmetodzie C ++ .

Mój były kolega przeprowadził porównawcze testy problemu dla ogromnych zestawów danych ( liczenie q- gramów przy użyciu dynamicznych kształtów) z szablonową implementacją C ++ i obiektową implementacją Java. Kod Java był o rząd wielkości wolniejszy niż kod C ++.

Oczywiście porównuje się jabłka z pomarańczami. Ale chodzi o to, że implementacja Java była najlepszą możliwą implementacją (pod względem wydajności, biorąc pod uwagę stopień modułowości wymagany dla biblioteki), podobnie jak implementacja C ++.

Niestety dane testu porównawczego nie są dostępne bezpłatnie, ale inni znaleźli podobne liczby, porównując obciążenie związane z abstrakcją środowiska uruchomieniowego. Na przykład Scott Meyers pisze w Effective STL o narzutach qsortfunkcji ogólnej C :

Sortowanie w C ++ praktycznie zawsze zawstydza qsort C, jeśli chodzi o szybkość. […] W czasie wykonywania sort wykonuje wewnętrzne wywołania funkcji porównania… podczas gdy qsort wywołuje funkcję porównania za pomocą wskaźnika. […] W moich testach na wektorze miliona podwójnych [sortowanie] przyspieszyło do 670% szybciej…

Konrad Rudolph
źródło
6
Szczerze std::sortmówiąc , jest to jeden z przypadków, w których trudno jest zrobić coś podobnego w innych językach. Ale ogromna większość projektów, które widziałem, nie są std::sortkodem podobnym do pisania . Piszą (zły) kod Java w C ++ i narzekają, że mają problemy.
Billy ONeal,
2
Czy masz jakieś raporty na temat tworzenia kopii zapasowej historii, że ogromne zbiory danych są powolne? Słyszałem, jak ludzie mówią o wykonywaniu operacji 1-2 miliony wpisów na listach, a to wciąż jest szybkie. I czy bałagan w ogromnych zestawach danych w pamięci (zwykle takich jak w DB) nie jest niszowym polem?
TheLQ
8
@TheLQ: źródłem jest książka SeqAn autorstwa Gogol-Döring & Reinert. A o twoim kontrprzykładzie: jakie operacje? A co uważają za „szybkie”? Również wpisy 1E6 nie są aż tak duże. ;-) A jeśli chodzi o to, czy jest to pole niszowe - na pewno. Ale tutaj potrzebujesz szybkich obliczeń. Chodzi o to, czy Java jest szybka , a nie czy jest „wystarczająco szybka” do niedrogich operacji. Na wystarczająco małym zestawie danych wszystko jest wystarczająco szybkie.
Konrad Rudolph
2
nie ma czegoś takiego jak najlepsza możliwa implementacja
jeremy-george
3
@fonzo Mogą być uzasadnione przybliżenia. Zrozum, że dla wystarczająco prostego algorytmu i dobrze zdefiniowanej metryki może istnieć najlepsza możliwa implementacja. Tak jest w tym przypadku. Algorytm jest prosty i istnieje dobrze zdefiniowany przypadek, dla którego zoptymalizowano: czas działania na danym wejściu.
Konrad Rudolph
28

Ponieważ jest wolny ... w niektórych aplikacjach. Aplikacje komputerowe muszą reagować od samego początku, a koszty początkowe liczą się jako wolne.

Z drugiej strony, jeśli uruchamiasz serwer, nie ma znaczenia, czy jest trochę ogrzewania (analiza i kompilacja JIT) - robisz to raz na niebieskim księżycu, więc przez większość czasu nie można tego uznać za całkowicie wolne.

Maciej Piechotka
źródło
Koszty uruchomienia są problemem, ale można go poprawić za pomocą niektórych przełączników wiersza poleceń
TheLQ
22
Ilu użytkowników faktycznie wie o przełącznikach wiersza poleceń?
Walter
17
TheLQ, jeśli możesz podać przełącznik wiersza polecenia, aby usunąć opóźnienie uruchamiania 1,5 s dla Swing / AWT, proszę śmiało i odpowiedz na to: stackoverflow.com/questions/508723/...
Peter Boughton
6
I jak dostosować te przełączniki wiersza polecenia, aby uniknąć blokowania całej przeglądarki na 5 sekund, jeśli kliknę link zawierający treść Java? Jest to coś, co sprawia, że ​​ludzie nazywają Javę wolnym i nie ma znaczenia, że ​​po załadowaniu działa ona dość szybko.
Roman Starkov
21

Powiedziałbym, że dzieje się tak, ponieważ kiedy ludzie po raz pierwszy się z tym spotkali, było to powolne. Na tej podstawie stworzyli wrażenie. Wrażenie to raczej nie zmieni się, jeśli go nie użyją i nie wykorzystają go z powodu tego wrażenia - to błędne koło.

Muszę przyznać, że miałem wrażenie, że Java jest powolna i tak, to z mojego wcześniejszego zetknięcia z nią. Teraz przeszedłem do różnych języków i od tego czasu mam bardzo ograniczone możliwości korzystania z Javy. W związku z tym moje zdanie niewiele się zmieniło.

Damovisa
źródło
3
+1 - całkowicie się zgadzam. Nienawidziłem Javy na początku. .NET Framework naprawdę pomógł zarządzanemu kodowi, ponieważ: podobało mi się C # i ostatecznie doceniłem także Javę.
Wizard79
7
Nadal trwa sekunda, aby uruchomić hello world. Jest wolny pod względem czasu uruchamiania.
intuicyjnie,
@intuited Spróbuj zbudować serwer na C ++ / C # lub jakimkolwiek innym języku, który możesz znaleźć HECK spróbuj zbudować go przy pomocy C, a następnie porównać z JAVA. Problem z C polega na tym, że jest szybki, jeśli jesteś typem „Ma, napisałem 10-liniowy kod C, który jest szybszy niż Java, ale nie możesz go odczytać”. Moment, w którym Twój kod C rośnie, twoja prędkość spada;)
AceofSpades
16

Ponieważ zmiana pokolenia ludzi na temat produktu wymaga pokolenia

Nie ma to nic wspólnego z szybkością Java. W ludzkich umysłach Java jest stałym identyfikatorem związanym ze słowem „slow”. Niewiele można z tym zrobić ani Ty, ani Oracle.

Po prostu ciesz się, że Oracle nie zniszczyło kultury programowania Java (jeszcze), robiąc coś pochopnego lub głupiego . Podobnie jak pobieranie nadmiernych kosztów licencji, aby z niego skorzystać. Lub pozywanie ludzi na podstawie patentów na oprogramowanie, które wcześniej były własnością Sun. ::westchnienie::

Nienawidzę być tutaj naysayer, ale jeśli Oracle i Google nie rozstrzygną walki o Javę na dobrych warunkach lub Google nie będzie zmuszony do zakupu Javy i uczyni ją „właściwą” platformą open source, Java jest na dobrej drodze, aby być dzieckiem plac zabaw z wszy. IE, nikt nie będzie chciał dotknąć go słupem o długości 20 stóp.

Uwaga: Żeby było jasne, kiedy mówię pokolenie, mówię w kategoriach ludzi, a nie komputerów. IE, dopóki ludzie, którzy utrzymują tę percepcję, nie umrą ze starości lub zostaną zastąpieni młodszym pokoleniem, percepcja będzie prawdziwa. Myśl w kategoriach 5 dekad, a nie 5 lat.

Evan Plaice
źródło
2
Myślę, że Google używa tak dużo Javy, że kupowanie go nie jest całkowicie niewykonalną teorią. Prawdopodobnie byłbym z tego zadowolony.
Bart van Heukelom,
1
@donroby: A kogo to obchodzi w tych językach? Za dwie dekady Java będzie niszowym językiem.
aasc
1
@aasc - Java może być przestarzała za dwie dekady, ale LISP nie jest teraz i nie będzie.
Don Roby
2
@aasc „Języki programowania zwykle nie żyją dłużej niż pokolenie” Dobry pan, 1 milion programistów Delphi, którzy są Pascal, 5 milionów programistów Visual Basic prowokuje ... nie wspominając o Perlu, Lisp, Fortran, Cobolu, C ++ jakieś uzasadnienie dla tego komentarza ???
Reallyethical
2
@Reallyethical Nie w głównym nurcie. Ile firm zależy od Lisp, Fortran, Cobol. W przypadku sepl jest w większości uwięziony w środowisku akademickim i wykorzystywany jako model dla funkcji innych języków, niewielu używa go do rzeczywistych projektów produkcyjnych. Fortran stał się niszowym językiem dla wysokowydajnego modelowania matematycznego, a Cobol pozostaje tylko dlatego, że sektor bankowy ma cholerną obawę przed zmianą starego / niezawodnego kodu na nową platformę. C ++ jest rażącym wyjątkiem, ponieważ jest nadal bardzo szeroko stosowany i przyjmowany do dziś.
Evan Plaice,
11

Jednym z powodów jest to, że ludzie ufają temu, co mówią inni zamiast tego, co widzą .

Zgodnie z tym, co powiedziano mi, kiedy zaczynałem programować, Java jest „wolniejsza” niż C ++, a powodem, dla którego można było używać Javy jest to, że jest „wygodna i łatwiejsza”. Powszechnie uważa się, że Java zapewnia bezpieczeństwo i wygodę kosztem wydajności. Nawet gdy później wymyślono język C #, ludzie uważają, że jest szybszy niż Java, ponieważ jest „natywny”.

Ale prawda, którą ludzie widzą bez wyczuwania, jest taka, że ​​zaćmienie, IDE zbudowane z Javą, jest absolutnie NAJSZYBSZYM IDE w klasie. Użyłem prawie wszystkich głównych IDE strumieni, tych z MS i GNU, Borland ... Zaćmienie jest absolutnym królem IDE, głównie ze względu na jego szybkość.

Innym powodem jest długi czas rozruchu .

Java nie nadaje się do tworzenia małej aplikacji, która pozostaje w zasobniku systemowym, zużywa trochę pamięci, wyskakuje okno dialogowe przypominające o przerwie; lub notatnik, którego używasz do otwierania pliku tekstowego, czytania go i zamykania. Powinien być używany na czymś WIELKIM, takim jak serwer WWW, który zawsze tam jest, optymalnie wykorzystuj zasoby komputerowe, odpowiadaj na miliony żądań co godzinę. Lub środowisko IDE, takie jak zaćmienie, które zarządza tysiącami plików obszaru roboczego. Uważam, że nie wiesz, że aplikacja Java jest szybka, dopóki nie będzie działać przez co najmniej kilka godzin.

Tactoth
źródło
1
Cały czas widzę powolność.
aasc
28
Zaćmienie szybkie? LMAO
finnw
2
@finnw - jest, jeśli dostroisz go. Po wyjęciu z pudełka i przy wszystkich wtyczkach oczywiście nie będzie to szybkie. Oczywiście nigdy nie można go porównać z vimem, jeditem lub Notepad ++, ale te „szybkie” lub „wolne” argumenty i instrukcje są bez znaczenia bez kontekstu.
luis.espinal
2
@luis możesz jednak porównać to do Delphi 7, co nie uważam za o wiele prostsze niż Eclipse. A Delphi 7 jest prawie tak szybki jak notatnik. To niesamowite.
Roman Starkov
4
@finnw, dla IDE z zillions wtyczki jest dość szybkie :)
8

@bigown „Dlaczego ludzie nadal twierdzą, że Java działa wolno?”

Ponieważ są głupi. Ponieważ nie mają doświadczenia zawodowego, ale myślą, że są żywą inkarnacją Dikjstry lub powtórnym przyjściem Linusa Torvalda, och, nie wiem. Powodów, dla których mówimy o tak upośledzonej rzeczy, jest tak wiele, ale zwykle stoją za nimi głupota, bezmyślny subiektywny fanboyizm i emocjonalne wyzyskiwanie uwagi.

Odłączmy to, abyś mógł zobaczyć prawdę o tym, co właśnie powiedziałem powyżej:

Po pierwsze, co jest wolne, w jakim kontekście, do czego, w jakich warunkach, z jakim celem inżynieryjnym / naukowym / biznesowym (mówiąc, że jest do bani, nie jest jednym z nich). Każda osoba, która mówi „X jest wolny” dla dowolnej technologii X lub po prostu „X to Y”, gdzie Y jest pewnego rodzaju negatywnym stwierdzeniem, bez odpowiedzi na którekolwiek z powyższych pytań należy odrzucić jako głupca. Takie stwierdzenia nie mają miejsca w inżynierii. Może w polityce i nieletnich czatach, ale nie w inżynierii.

Po drugie, większość tych błędnych głupców płacze, że Java jest powolna, ponieważ ZOMG, ich zaćmienie trwa wiecznie, aby odpalić (rany, załaduj to z wszystkimi wtyczkami i zgadnij, co się stanie). Większość z tych głupców nawet nie wie, jak to zrobić aby dostroić Jvm, aby Eclipse działało szybko (lub dla dowolnej aplikacji Java w tym zakresie). Oznacza to, że nie mają pojęcia o dostrajaniu wydajności, co jest rzeczywistością nie tylko dla Javy, ale dla każdego niebanalnego systemu, czy to sprzętu, czy oprogramowania. Więc właśnie tam rozbroją się za jakąkolwiek techniczną ważność, czyniąc takie bezmyślne stwierdzenia.

Po trzecie, zastanówmy się, na czym polega większość rozwoju Java: przede wszystkim back-end OLTP; drugie miejsce zajmują systemy monitorowania. Każdy typ systemu ma działać w klastrach i działać nieprzerwanie przez tygodnie, jeśli nie miesiące. Czy to naprawdę ma znaczenie, że ładowanie twojej małej zaćmienia lub zabawki zajmuje minutę lub dwie, gdy celem PRAWDZIWYCH aplikacji Java jest uruchamianie przez dłuższy czas? Kontekst, ludzie, kontekst.

Wreszcie szkielet OLTP w Google i Ebay działają w Javie. Uznałem to za dowód sprzeczności, że Java nie jest powolna (przynajmniej w przypadku warunków, które mają znaczenie, nie w przypadku małych eksperymentów z zabawkami, testów porównawczych i nie dających się zweryfikować nieoficjalnych dowodów wykonanych specjalnie w celu powiedzenia: „X jest wolny, jest do kitu”.

Jest inżynieria i fanboyizm. Zgadnij, do jakich kategorii należą takie?

luis.espinal
źródło
19
Jeśli muszę dostroić moją maszynę JVM, aby Java działała akceptowalnie szybko, a ja nie muszę niczego dostosowywać (oprócz -O2), aby C ++ działał akceptowalnie szybko, wówczas Java jest wolna.
David Thornley
@David - Oczywiste oświadczenie. Każdy wie, że Java jest wolniejsza niż C ++. Nie oznacza to jednak logicznie, że jest powolny. Ani wzmianka o flagach gcc nie nadaje ważności komentarza. Stwierdza jedynie, że it is slower than something else.jaguar jest wolniejszy niż gepard. Czy to czyni tę pierwszą slow? Wypróbuj obiektywną inżynierię i zadaj sobie następujące pytanie: czy można logicznie stwierdzić, arbitrarilyże coś jest slowpo prostu dlatego, że it is slowercoś innego without mentioning a context of operationsdefiniuje, co jest fast enoughi po co? Czy potrafisz logicznie?
luis.espinal
5
@ luis.espinal: Odpowiedziałem na twój powód # 2: że ludzie mówią, że Java jest wolna, ponieważ Twoim zdaniem nie udało się dostroić Java. Zwróć też uwagę na moje użycie „akceptowalnie szybkiego”. Wydaje mi się, że coś, co nie jest „akceptowalnie szybkie”, jest powolne i wydaje mi się, że coś, co ludzie rutynowo twierdzą, że jest powolne, prawdopodobnie nie jest akceptowalnie szybkie.
David Thornley,
4
@luis espinal Brzmisz jak Kant :) Ludzie tutaj domyślnie założyli, że slow oznacza wolniej w porównaniu z innymi praktycznymi, gotowymi do produkcji językami, takimi jak C ++. (Pamiętasz fizykę?), Kiedy mierzysz energię potencjalną, zawsze mierzysz ją względem pewnego gruntu. Przechodząc teraz do twojej gramatyki, „X jest głupi” jest bezpodstawne. a „X jest głupszy od Knutha” nie czyni X absolutnym głupcem, ponieważ praktycznie każdy może być X tutaj. Zgadzam się, że nazywanie lang slow nie jest elitarne, ale ludzie tutaj, którzy twierdzą, że nie są „głupi”, ale akurat przyjęli domniemane domniemanie.
yati sagade
1
@luis hahaa .. ładna obserwacja. (Moje przekonanie, że jesteś reinkarnacją Kanta, stało się jeszcze bardziej solidne;)) I takie dyskusje kończą się wojnami płomieni i nieproduktywnymi naciśnięciami klawiszy ... Według mnie zawsze należy trzymać się tego, co wydaje się najlepszym narzędziem do walki praca pod ręką. Zgadzam się, Kant2? : P
yati sagade
8

Ponieważ tak jest, czy możemy zamknąć ten temat raz na zawsze?

https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf [przewiń w dół do tabel, Java jest 3.7-12.6 razy wolniejsza niż C ++, badania przeprowadzone przez pracowników Google]

PS: Jeśli tak nie jest, na początek podaj mi przynajmniej jedną zgrabną aplikację Java, jeszcze jej nie widziałem.

kodera
źródło
6
Podsumuj treść pliku PDF w swojej odpowiedzi.
Adam Lear
1
Ten artykuł jest bardzo daleki od standardów badań naukowych. Nie porównuje nawet dokładnie tych samych algorytmów i optymalizacji we wszystkich językach. „E. Tuning Java Jeremy Manson podniósł wydajność Javy na równi z oryginalną wersją C ++. Ta wersja jest przechowywana w katalogu java_pro. Zauważ, że Jeremy celowo odmówił dalszej optymalizacji kodu, wiele optymalizacji C ++ miałoby zastosowanie do Javy również wersja ”. jeremymanson.blogspot.com/2011/06/scala-java-shootout.html
Piotr
6

TMHO, dzieje się tak z powodu czasu potrzebnego do uruchomienia maszyny wirtualnej w przeglądarce. Jeśli aplikacja uruchomi się powoli, ludzie tylko to zapamiętają. Ponieważ długi czas rozruchu jest naprawdę denerwujący. Naprawdę. Jeden z moich współpracowników powiedział mi, że nie używa Firefoksa, ponieważ jest on zbyt wolny. (?!?). Ale tak, Ok, w systemie Windows Firefox zajmuje dużo czasu. Według niego ta aplikacja jest powolna, pomyślał o jej ogólnej szybkości.

Pierre Watelet
źródło
Właśnie dlatego Mozilla bardzo się stara, aby Firefox szybko zaczął
działać
2
Może się okazać jak Windows. Tak, po zalogowaniu zobaczysz pulpit naprawdę szybko, ale nadal musisz poczekać, aż zacznie reagować.
Bart van Heukelom,
6

Wolno w porównaniu do czego? Zastanawiam się nad zmianą ze zwykłego Ruby na JRuby (Ruby oparty na Javie), ponieważ słyszałem, że jest szybszy.

Andrew Grimm
źródło
1
JRuby jest szybszy niż Ruby, nawet w wersji 1.9. Różnica się jednak zmniejsza.
Dan Rosenstark
2
+1 za wskazanie dużego problemu. Chociaż powiedziałbym, że OP prawdopodobnie porównuje do C # lub C ++.
Billy ONeal,
@ Yar, zwracasz uwagę, że CRuby dogania JRUby?
6

Opinie są opiniami, a fakty są faktami.

Oto fakt z Google Code Jam, który prawdopodobnie prosi programistów o rozwiązanie trudnych problemów informatycznych w krótkim czasie, co oznacza, że ​​wydajność języka, którego używają, odgrywa ważną rolę:

W poprzednich edycjach (2009, 2010, 2011) około 75% programistów, którzy dotarli do ostatnich rund, korzystało z C ++, w przeciwieństwie do około 15% z Javą.

Źródło -> http://www.go-hero.net/jam/

Daniel Scocco
źródło
3
To tylko naprawdę dowodzi, że Java może awansować na szczyt konkurencji skoncentrowanej na szybkości, ale większość ludzi wybiera C ++.
Adam Lear
3
„rozwiązywanie trudnych problemów informatycznych w krótkim czasie” - ile czasu zajmuje napisanie kodu, czy czas potrzebny na uruchomienie kodu? Niezależnie od tego, twój fakt jest taki - fakt - co to ma wspólnego z pytaniem? Czy wyciągasz wnioski ze swojego faktu?
occulus
co może być spowodowane tym, że 75% osób piszących programy, które sprawiają, że ostatnie rundy uważają, że Java działa wolno bez testowania jej, dlatego zamiast tego używa C ++, ponieważ uważa, że ​​jest szybka bez testowania.
jwenting
4

Około 1997 roku korzystałem z HP Vectra VE (200 MHz) i Windows 95. Większość aplikacji działała na tym bardzo szybko, ale potem wypróbowałem kilka aplikacji napisanych w Javie (IDE, jeśli dobrze pamiętam). Byli bardzo powolni, przynajmniej część GUI. Uruchomienie zajęło dużo czasu, a elementy GUI (np. Menu) nie reagowały bardzo szybko - występowały opóźnienia w wizualnej informacji zwrotnej. Ponieważ aplikacje Java GUI miały (ma) dość charakterystyczny wygląd, nauczyłem się kojarzyć ten wygląd (i Javę) ze słabą wydajnością.

Andreas Rejbrand
źródło
2
Pamiętam 1997! Świetny rok, choć wiele win - i spostrzeżeń - z 1997 roku nie nadaje się już do użytku.
Dan Rosenstark
1
Dobrze pamiętam też rok 1997. System Windows ciągle się zawieszał i wymagał ponownego uruchomienia podczas instalacji sterownika. Śmieć.
I nie zmieniłeś zdania z 1997 roku? Czy zauważyłeś, że rok 2011 jest zupełnie inny niż rok 1997?
Jesper
5
Moja analiza z tych danych byłaby taka, jak zassana w 1997 roku.
JasonTrue
4

To zależy od tego, co rozumiesz jako powolność.

Po pierwsze, java as poczyniła ostatnio wiele postępów i w większości przypadków jest bardzo szybka. Ale :

  • Podczas uruchamiania Java działa wolno, ponieważ przed wykonaniem czegokolwiek musisz załadować maszynę JVM.
  • Niektóre funkcje bezpieczeństwa mogą zabijać występy w niektórych przypadkach. Przykład kontroli granicznej z dostępem losowym.
  • Spraw, aby coś naprawdę szybkiego w Javie wymagało działania przeciwko JVM (na przykład skorzystaj z linii pamięci podręcznej).
  • Brak metaprogramowania implikuje karę w czasie wykonywania każdej abstrakcji, dlatego wydajność w wielu przypadkach kosztuje projekt.
  • Java z trudem może zapewnić ograniczenie czasu rzeczywistego - zgodnie z projektem - i może to być uważane przez niektórych za „wolne”.

Nawiasem mówiąc, java jest w niektórych przypadkach szybsza niż waniliowa C / C ++. Ale te języki zapewniają narzędzia do ich poprawiania.

Java to język programowania ukierunkowany na produktywność. Teraz jest wystarczająco szybki dla większości aplikacji, ale nie jest wystarczający dla niektórych innych.

Ogólnie powolność Javy jest nadużywanym argumentem, ponieważ w większości przypadków jest nieistotna.

deadalnix
źródło
2

Prosty, kanoniczny kod Java jest na ogół równy lub szybszy niż prosty, kanoniczny kod C / C ++ / D. Prosty, kanoniczny kod zwykle niepotrzebnie wykonuje wiele alokacji pamięci, nie jest specjalnie dostosowany do żadnej architektury procesora, nie ma ton optymalizacji na niskim poziomie itp. HotSpot GC Java jest niesamowity, a optymalizacje maszyn wirtualnych być lepszym niż to, co mógłby zrobić kompilator statyczny.

Z drugiej strony, jeśli naprawdę potrzebujesz wydajności i chcesz ręcznie dostroić rzeczy, aby ją uzyskać, C / C ++ / D zapewnia o wiele więcej możliwości. Nie można używać wbudowanego asemblera w Javie. Nie można używać sztuczek punkujących typu brudnego do traktowania liczb zmiennoprzecinkowych jako tablic bitów. Nie można używać niestandardowych schematów zarządzania pamięcią, które mogą być szybsze niż GC dla konkretnego przypadku użycia. Nie można przydzielić prawie tyle samo na stosie w Javie, co w C / C ++ / D. W Javie jedynym sposobem na uzyskanie czegokolwiek równoważnego funkcjom wyższego rzędu jest użycie interfejsów i powiązania środowiska wykonawczego. W D i (myślę, popraw mnie, jeśli się mylę) C ++ możesz przekazywać funkcje do szablonów, pozwalając na wiązanie w czasie kompilacji bez utraty elastyczności.

dsimcha
źródło
5
Czy możesz podać te komentarze? Tj. Gdzie są jakieś testy porównawcze pokazujące kod kanoniczny w każdym języku pokazujące, że Java jest szybsza?
Billy ONeal,
1

Kolejnym punktem „spowolnienia” Java jest 64-bitowe środowisko uruchomieniowe.

Słyszałem, jak niektórzy ludzie narzekają, że Java działa na nich bardzo wolno na komputerach 64-bitowych. Jak się okazuje, 64-bitowe środowisko Java wykorzystuje serwer JVM, który kompiluje cały program przed uruchomieniem.

TUTAJ wyjaśniono, dlaczego 64-bitowa maszyna wirtualna zaczyna działać wolniej.

Na przykład w systemie Windows:

C:\> java -version  
java version "1.6.0_21"  
Java(TM) SE Runtime Environment (build 1.6.0_21-b06)  
Java HotSpot(TM) 64-Bit Server VM (build 17.0-b16, mixed mode)  
AndrejaKo
źródło
3
Uruchomienie maszyny wirtualnej serwera jest wolniejsze, ale nie natywnie kompiluje całego programu przed uruchomieniem. Nie mogło, klasy są ładowane leniwie i potencjalnie poprzez odbicie, więc nie ma możliwości wcześniejszego ustalenia, jaki kod bajtowy należałoby skompilować natywnie.
Dan Dyer,
@ Dan Dyer Po kilku badaniach wydaje się, że źle zrozumiałem to, co przeczytałem. Miałem na myśli to, że serwer VM wykonuje więcej optymalizacji, podczas gdy klient jest zoptymalizowany pod kątem szybkiego uruchamiania i mniejszego zużycia pamięci.
AndrejaKo,
serwerowa maszyna wirtualna jest zoptymalizowana pod kątem długotrwałych procesów, dlatego wstępnie ładuje więcej, co prowadzi do dłuższych czasów uruchamiania i zwykle zużywa więcej pamięci RAM. Klient maszyn wirtualnych jest zoptymalizowany pod kątem mniejszej powierzchni i czasu uruchamiania, ale może mieć mniejszą wydajność.
jwenting
0

Wydajność Javy jest jednak bardzo subiektywna, jednak spostrzeżenie, dlaczego Java jest powolna, wynika w dużej mierze z powodów, które zauważyli inni: postrzeganie czegoś przez większość ludzi jest zabarwione jego wcześniejszym doświadczeniem z tym językiem, a Java nie zawsze była dobrze zoptymalizowanym językiem kaptur. Podobnie, waniliowe Eclipse nie jest dokładnie szybkim środowiskiem IDE do pracy i blednie pod względem czasu reakcji w porównaniu do środowiska IDE takiego jak Visual Studio.

To powiedziawszy jednak, poza problemami z interfejsem użytkownika, które Java ma podczas uruchamiania, jest wystarczająco szybka dla większości aplikacji. Jeśli szukasz, możesz znaleźć artykuły, które porównują go z innymi językami, a większość prezentowanych wyników umieści go w zakresie, w którym będzie to problem tylko w przypadku dużych zestawów danych.

W dziedzinie bioinformatyki jest używany dość często, ponieważ jest dobrze obsługiwany i istnieje już podstawa instalacyjna, jedną z zalet Javy jest to, że można z nią zrobić dość szybki rozwój, którego nie można zrobić z C Jeśli spojrzysz na języki używane w bioinformatyce (osobiście używam R, Python i Java regularnie), zauważysz, że żaden z nich nie jest dokładnie najszybszy i nie jest niczym niezwykłym, że zbiory danych w bioinformatyce sięgają setek gigabajtów informacji. Pod koniec dnia czas ludzki jest jeszcze bardziej cenny i chociaż zauważalne są różnice prędkości, wielkość zbiorów danych jest na tyle duża, że ​​i tak działają przez noc.

Gdyby łatwiej napisać zgrabny interfejs użytkownika w Javie, wygląda to tak, że postrzeganie prędkości spadłoby z radaru, ponieważ większość ludzi nie pcha języków na tyle, że prędkość jest naprawdę problemem na co dzień.

rjzii
źródło
0

Aby rzucić bezwartościową monetę, stwierdzam, że aplikacje Java mają zwykle długi czas uruchamiania i odpowiedzi, co wydaje mi się, że Python lub Ruby poradziliby sobie lepiej.

Używam Eclipse do większości moich programów i muszę powiedzieć, że Java jest tak samo szybka, jak wszystko inne, jeśli nie szybsza, działa lokalnie i „autonomicznie”.

Thomas
źródło
1
W Internecie czas uruchamiania nie jest tak ważny. Najważniejsze jest zużycie zasobów i skalowalność.
Berin Loritsch
-7

Powiedziałbym, że Java jest nieskończenie powolna, nie tylko powolna, ponieważ nie rozwiązuje prostych problemów, które są łatwe w prawdziwych językach wysokiego poziomu.

Dam prosty przykład. Istnieje prosta optymalizacja, która ma zastosowanie przy dwukrotnym mapowaniu listy, zwana wylesianiem: oto reguła dla niej napisana w moim języku Felix:

reduce deforest[T,U,V] (f:T->U, g:U->V, x:list[T]): 
  map g (map f x) => map (compose(g,f)) x
;

co mówi: zamiast mapować listę x za pomocą f, a następnie mapować ją ponownie za pomocą g, wymagając dwóch przejść listy i utworzenia tymczasowej listy śmieci, wystarczy zmapować listę składem funkcji.

Jest to optymalizacja wysokiego poziomu znacznie ważniejsza niż wydajność Java JVM na niskim poziomie. Specyfikacja, którą podałem powyżej, to nie tylko ładna składnia, to instrukcja napisana przez użytkownika informująca kompilator Felix, jak przeprowadzić optymalizację.

Pokaż, jak to zrobić w Javie. Nie? Zatem Java jest wolna. Bardzo wolno. [Haskell może to zrobić automatycznie, jak sądzę].

I zanim powiesz „ale Java jest językiem OO, ten rodzaj optymalizacji nie ma zastosowania”… cóż, właśnie o to mi chodzi. Java jest do bani, a bycie OO jest jednym z głównych powodów.

Optymalizacja JIT nigdy nie może zbliżyć się nawet do konkurowania z rodzajami optymalizacji, które może wykonać przyzwoity kompilator.

Yttrill
źródło
3
Nie mam pojęcia, co tam robi twój kod. A jeśli powiesz, że cały język jest powolny tylko dlatego, że nie może dokonać jednej drobnej optymalizacji, to są tu inne problemy
TheLQ
7
-1 wykopując stare pytanie i obalając język bardzo marnymi argumentami. Powiedz mi, czy chcesz szczegółowy opis tego, co jest nie tak z twoim rozumowaniem. Na początek, określenie OO jako głównego powodu, dla którego jest do bani, nie jest zbyt obiektywne, a de facto wydajność JVM + JIT jest bardzo dobra, nawet jeśli pominięto optymalizacje.
8
Haskell jest nieskończenie wolniejszy niż Java dla naszej głównej platformy, ponieważ nie jest przeniesiony na tę platformę, więc Haskell jest do bani ...
1
@ Thorbjørn Ravn Andersen Naprawdę chciałbym dać +1 za tę obserwację.
Patrick Hughes,