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?
java
performance
TheLQ
źródło
źródło
Odpowiedzi:
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ąć ...
źródło
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.sort
metodę, która wykorzystuje różne implementacje dla wszystkich podstawowych typów i której wariant obiektu jest wciąż znacznie wolniejszy niż ogólny C ++,sort
ponieważ 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
sort
metodzie 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
qsort
funkcji ogólnej C :źródło
std::sort
mó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::sort
kodem podobnym do pisania . Piszą (zły) kod Java w C ++ i narzekają, że mają problemy.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.
źródło
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.
źródło
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.
źródło
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.
źródło
@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?
źródło
-O2
), aby C ++ działał akceptowalnie szybko, wówczas Java jest wolna.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ś jestslow
po prostu dlatego, żeit is slower
coś innegowithout mentioning a context of operations
definiuje, co jestfast enough
i po co? Czy potrafisz logicznie?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.
źródło
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.
źródło
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.
źródło
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/
źródło
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ą.
źródło
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 :
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.
źródło
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.
źródło
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:
źródło
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ń.
źródło
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”.
źródło
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:
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.
źródło