it-swarm.it

Perché la gente dice ancora Java è lento?

Per lungo tempo in SO e in altri luoghi Java ha la reputazione di essere lento. Da battute a molti commenti in domande e risposte, la gente crede ancora che Java sia lento basato esclusivamente sull'esperienza con esso negli anni '90.

Questo è il mio problema: abbiamo smentito (la maggior parte) dei motivi per cui le persone credono che Java sia lento. Al di fuori delle piccole cose, Java è piuttosto veloce.

Allora perché la gente rifiuta ancora di credere che Java sia veloce adesso? Fa parte della loro mentalità che tutto ciò che non è C/C++ è lento? È perché le persone non controllano nel tempo? È perché le persone sono solo di parte?

61
TheLQ

Sono le applicazioni. Come notate, abbiamo hanno dimostrato, di volta in volta, che in scenari inventati Java può incontrare o addirittura beat le prestazioni di i cosiddetti linguaggi "performanti" come C, C++, LISP, VB6 o JavaScript. E quando presentati con tali prove, la maggior parte degli oppositori sani di mente e aperti apriranno la testa per la vergogna e promettono di non diffondere mai più tale calunnia.

... ma poi, accendono Eclipse, o NetBeans o Guiffy, o abilitano il Java nel loro browser, o provano a eseguire un'app sul loro telefono preferito. E aspettano affinché diventi reattivo ...

...e aspetta...

...e aspetta...



...e aspetta...







...e aspetta...











...e...




... cosa ho promesso di non fare mai più? Scusa, devo essermi appisolato ...

131
Shog9

Questa domanda funziona su premesse false: dove conta, Java è ancora lento. Dove conta sono algoritmi pesanti di calcolo su grandi set di dati. Certo, questi possono essere ottimizzati, a volte per essere alla pari con il codice C/C++, ma solo a costo di modularità e genericità. Il codice C++ efficiente può essere progettato per essere generico e utilizzabile come libreria per scopi generici. Java impossibile. Basta guardare il Array.sort metodo, che utilizza diverse implementazioni per tutti i tipi fondamentali e la cui variante dell'oggetto è ancora molto più lenta del generico sort di C++ perché questi oggetti devono inviare dinamicamente confronti di uguaglianza.

Concesso, le ottimizzazioni just in time eseguite dal motore HotSpot possono effettivamente prevedere l'obiettivo di queste chiamate virtuali e tentare di inline. Ma questo è ancora più lento della chiamata direttamente incorporata che viene inviata all'interno del metodo sort di C++.

Un mio ex collega ha fatto benchmark comparativi di un problema su enormi set di dati ( q - conteggio dei grammi usando forme dinamiche) con un'implementazione C++ basata su modelli e un orientato agli oggetti Java. Il Java era di ordini di grandezza più lenti del codice C++.

Naturalmente questo sta confrontando le mele con le arance. Ma il punto è che l'implementazione Java è stata la migliore implementazione possibile (in termini di prestazioni, dato il grado di modularità richiesto per una libreria), così come l'implementazione C++.

Sfortunatamente, i dati di riferimento non sono disponibili gratuitamente, ma altri hanno trovato numeri simili quando si confrontano le spese generali dell'astrazione di runtime. Ad esempio, Scott Meyers scrive in STL effettivo sull'overhead della funzione generica qsort di C:

L'ordinamento di C++ praticamente mette sempre in imbarazzo il qsort di C quando si tratta di velocità. [...] In fase di esecuzione, sort effettua chiamate in linea alla sua funzione di confronto ... mentre qsort chiama la sua funzione di confronto tramite un puntatore. [...] Nei miei test su un vettore di un milione di doppi, [sort] ha funzionato fino al 670% più veloce ...

48
Konrad Rudolph

Perché è lento ... in alcune applicazioni. Le applicazioni desktop devono essere reattive dall'inizio e l'overhead di avvio viene considerato lento.

D'altra parte, se si esegue un server, non importa se c'è un po 'di riscaldamento (analisi e compilazione JIT): lo si fa una volta sulla luna blu, quindi il più delle volte non può essere considerato del tutto lento.

28

Direi che perché la gente l'ha incontrato per la prima volta, è stato lento. Sulla base di ciò, ne hanno fatto un'impressione. È improbabile che quell'impressione cambi se non la usano e non la usano a causa di quella impressione - è un circolo vizioso.

Devo ammettere che ho avuto l'impressione che Java era lento e sì, che era dalla mia precedente esposizione ad esso. Ora sono passato a lingue diverse e ho avuto un'esposizione estremamente limitata a Java da allora. Di conseguenza, la mia opinione non è cambiata molto.

21
Damovisa

Perché ci vuole una generazione per cambiare le percezioni delle persone su un prodotto

Non ha nulla a che fare con la velocità Java. Nella mente delle persone Java è un identificatore const associato alla parola 'slow'. C'è poco, niente che tu o Oracle può fare al riguardo.

Sii contento che Oracle non abbia distrutto la Java cultura della programmazione (ancora) facendo qualcosa avventato o stupido . Come addebitare costi eccessivi per l'uso della licenza. persone basate su brevetti software precedentemente di proprietà di Sun. :: sigh ::

Odio essere il viandante qui, ma, a meno che Oracle e Google non risolvano il Java lotta in termini di Nizza, o Google è costretto ad acquistare Java e lo rende un piattaforma open source "corretta", Java è sulla buona strada per essere il bambino nel parco giochi che ha i pidocchi. IE, nessuno vorrà toccarlo con un palo da 20 piedi.

Nota: solo per essere chiari, quando dico generazione sto parlando in termini di persone e non di computer. IE, fino a quando le persone che detengono quella percezione muoiono di vecchiaia o sostituite da una generazione più giovane la percezione resterà vera. Pensa in termini di 5 decenni e non di 5 anni.

16
Evan Plaice

Uno dei motivi è che le persone si fidano di ciò che gli altri dicono invece di ciò che vedono.

Secondo quanto mi è stato detto quando ho iniziato a programmare, Java è "più lento" di C++, e il motivo per cui Java potrebbe essere usato è perché è "conveniente e più semplice ". Si ritiene molto comunemente che Java porta sicurezza e convenienza, a scapito delle prestazioni. Anche quando in seguito viene inventato C # le persone credono che sia più veloce di Java perché è "nativo".

Ma la verità che la gente vede senza percepirlo, è che, Eclipse, il IDE che è costruito con Java, è assolutamente il PIÙ VELOCE IDE in classe. Ho usato quasi tutti i principali IDE di stream, quelli di MS e GNU, Borland ..., Eclipse è il re assoluto degli IDE, in gran parte a causa della sua velocità.

Un altro motivo è il suo tempo di avvio lungo.

Java non è adatto per lo sviluppo di una piccola app che rimane nella barra delle applicazioni, consuma un po 'di memoria, apre una finestra di dialogo che ti ricorda di fare una pausa; o un blocco note che usi per aprire un file di testo, leggerlo e chiuderlo. Dovrebbe essere usato su qualcosa di GRANDE, come un web server che è sempre lì, fare un uso ottimizzato della tua risorsa informatica, rispondere a milioni di richieste ogni ora. O un IDE come Eclipse che gestisce migliaia di file dello spazio di lavoro. Non conosci te Java è veloce fino a quando non viene eseguita per almeno alcune ore, Credo.

11
tactoth

@bigown "Perché la gente dice ancora Java è lento?"

Perché sono stupidi. Perché non hanno esperienza lavorativa, ma pensano di essere l'incarnazione vivente di Dikjstra o la seconda venuta di Linus Torvald, oh non lo so. Le ragioni per dire una cosa così ritardata sono così tante, ma di solito stupidità, fanboyismo soggettivo insensato e puttana dell'attenzione emotiva sembrano essere dietro di loro.

Disettiamo questo in modo che tu possa vedere la verità di quello che ho appena detto sopra:

Innanzitutto, ciò che è lento, in quale contesto, per cosa, in quali condizioni, con quale scopo ingegneristico/scientifico/commerciale (per dire fa schifo non è uno di questi.) Chiunque dica " X è lento "per qualsiasi tecnologia X, o semplicemente" X è Y "in cui Y è un tipo di affermazione negativa, senza rispondere a nessuna delle domande di cui sopra dovrebbe essere respinto come uno sciocco. Dichiarazioni del genere non hanno un posto nell'ingegneria. In politica e nelle chat room giovanili forse, ma non in ingegneria.

In secondo luogo, la maggior parte di questi sciocchi sbagliati piangono per Java è lento perché ZOMG, la loro Eclipse impiega un'eternità ad accendersi (diamine, carica la cosa con tutti i plug-in e indovina cosa succede). di questi sciocchi non sa nemmeno come mettere a punto jvm affinché Eclipse funzioni velocemente (o per qualsiasi Java per quella materia). Cioè, non hanno idea della messa a punto delle prestazioni, che è una realtà non solo per Java, ma per qualsiasi sistema non banale, sia esso hardware o software. Quindi, proprio lì, si disarmano per qualsiasi validità tecnica nel rilasciare dichiarazioni così insensate.

Terzo, consideriamo quale sia la maggior parte di Java sviluppo è per: back end OLTP prima di tutto; i sistemi di monitoraggio sono secondi. Entrambi i tipi di sistema sono destinati a eseguito in cluster e per funzionare ininterrottamente per settimane, se non per mesi. È davvero importante che la tua piccola app Eclipse o giocattolo impieghi un minuto o due a caricarsi quando lo scopo di REAL Java app è funzionare per lunghi periodi di tempo? Contesto, persone, contesto.

Infine, la spina dorsale di OLTP su Google ed Ebay funziona su Java. Lo prenderei come prova per contraddizione che Java non è lento (almeno per condizioni che contano, non per piccoli esperimenti giocattolo, parametri di riferimento e prove annecdotali non verificabili fatte specificamente allo scopo di dire "X è lento, fa schifo".

C'è ingegneria e c'è fanboyismo. Indovina a quali dichiarazioni di categoria simili appartengono?

8
luis.espinal

Perché lo è, possiamo chiudere questo argomento una volta per sempre?

https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf [scorri verso il basso fino alle tabelle, Java è 3.7 -12,6 volte più lento del C++, ricerca condotta dai dipendenti di Google]

P.S .: In caso contrario, nominami almeno una snappy Java per iniziare, non ne ho mai vista una prima.

8
Coder

Lento rispetto a cosa? Sto pensando di passare dall'ordinario Ruby a JRuby (Ruby basato su Java) perché ho sentito che è più veloce.

6
Andrew Grimm

Le opinioni sono opinioni e i fatti sono fatti.

Ecco un fatto tratto da Google Code Jam, che probabilmente sfida i programmatori a risolvere problemi informatici difficili in un breve periodo di tempo, il che significa che le prestazioni del linguaggio che usano svolgono un ruolo importante:

Durante le passate edizioni (2009, 2010, 2011), circa il 75% dei programmatori che erano arrivati ​​ai round finali utilizzava C++, rispetto a circa il 15% utilizzando Java.

Fonte -> http://www.go-hero.net/jam/

6
Daniel Scocco

TMHO, questo è a causa del tempo necessario per avviare VM nel browser. Se un'applicazione si avvia lentamente, la gente lo ricorderà solo. Perché, il tempo di inizio lungo è davvero fastidioso. Davvero. Uno del mio collega mi ha detto che non usa Firefox perché è troppo lento. (?!?). Ma, sì, ok, su Windows, Firefox impiega molto tempo a mostrarsi. Secondo lui, questa app è lenta, ha pensato alla sua velocità generale.

6
Pierre Watelet

Intorno al 1997 ho usato un HP Vectra VE (200 MHz) e Windows 95. La maggior parte delle applicazioni funzionava molto velocemente su questo, ma poi ho provato alcune applicazioni scritte in Java (IDE, se ricordo bene). Erano molto lenti, almeno le parti della GUI. Ci sono voluti molto tempo per avviarsi e gli elementi della GUI (ad esempio i menu) non erano molto reattivi: c'erano dei ritardi nel feedback visivo. Inoltre, poiché Java le applicazioni della GUI avevano (ha) un aspetto piuttosto distintivo, ho imparato ad associare questo look (e Java) a prestazioni scadenti.

4
Andreas Rejbrand

Dipende da cosa intendi come lento.

Prima di tutto, Java ha fatto molti progressi di recente ed è molto veloce nella maggior parte dei casi.

  • Java è lento all'avvio, perché devi caricare la JVM prima di fare qualsiasi cosa.
  • Alcune funzionalità di sicurezza possono uccidere le prestazioni in alcuni casi. Il controllo associato con accesso casuale è un esempio.
  • Crea qualcosa di veramente veloce in Java richiede di lavorare contro la JVM (per sfruttare la linea della cache per esempio).
  • La mancanza di metaprogrammazione implica una penalità in fase di esecuzione con ogni astrazione, quindi le prestazioni arrivano al costo del design in molti casi.
  • Java difficilmente può garantire vincoli in tempo reale - in base alla progettazione - e questo potrebbe essere considerato "lento" da alcune persone.

A proposito, Java è, in alcuni casi, più veloce di Vanilla C/C++. Ma questi linguaggi ti danno gli strumenti per modificarli.

Java è un linguaggio di programmazione volto alla produttività. Ora è abbastanza veloce per la maggior parte delle applicazioni, ma non è sufficiente per alcuni altri.

In generale, la lentezza di Java è un argomento abusato perché nella maggior parte dei casi è irrilevante.

4
deadalnix

Semplice, canonico Java tende ad essere alla pari o più veloce del semplice codice canonico C/C++/D. Il semplice codice canonico tende a eseguire inutilmente molte allocazioni di memoria, non essere particolarmente sintonizzato su qualsiasi architettura della CPU, non ci sono tonnellate di ottimizzazioni di basso livello, ecc. L'HotSpot GC di Java è a dir poco sorprendente, e le ottimizzazioni VM tendono ad essere migliori di quelle di un compilatore statico potrebbe fare.

D'altra parte, se davvero hai bisogno di prestazioni e sei disposto a mettere a punto le cose per ottenerle, C/C++/D offre molte più opportunità per questo. Non è possibile utilizzare l'assemblatore inline in Java. Non è possibile utilizzare i trucchi di punzonatura di tipo sporco per trattare i numeri in virgola mobile come matrici di bit. Non è possibile utilizzare schemi di gestione della memoria personalizzati che potrebbero essere più veloci del GC per il proprio caso d'uso specifico. Non puoi allocare quasi nello stack in Java come in C/C++/D. In Java l'unico modo per ottenere qualcosa di approssimativamente equivalente a le funzioni di ordine superiore sono con interfacce e binding di runtime. In D e (penso, correggimi se sbaglio) C++, puoi passare le funzioni ai template, permettendo che l'associazione avvenga in fase di compilazione senza perdita di flessibilità.

2
dsimcha

Un altro punto per "lentezza" di Java è il runtime a 64 bit.

Ho sentito alcune persone lamentarsi che Java è molto lento per loro su computer a 64 bit. A quanto pare, 64 bit Java runtime utilizza il server JVM che compila l'intero programma prima di iniziare.

QUI è la spiegazione del perché 64 bit VM si avvia più lentamente.

Ad esempio su 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)  
1
AndrejaKo

Per lanciare una moneta senza valore, trovo che Java generalmente hanno tempi di avvio e di risposta lunghi, dove mi sembra che Python o Ruby avrebbe fatto di meglio.

Uso Eclipse per la maggior parte della mia programmazione e devo dire che Java è altrettanto veloce di qualsiasi altra cosa, se non più veloce in esecuzione localmente e "autonomo".

0
thomas

Le prestazioni di Java è comunque molto soggettiva, la percezione del perché Java è lenta è in gran parte per ragioni che altri hanno notato: la percezione della maggior parte delle persone di qualcosa è colorata dalla loro precedente esperienza con esso e Java non è sempre stato un linguaggio ben ottimizzato sotto il cofano. Allo stesso modo, Vanilla Eclipse non è esattamente un veloce IDE lavorare con e impallidisce in termini di reattività rispetto a un IDE come Visual Studio.

Detto questo, al di fuori dei problemi dell'interfaccia utente che Java ha all'avvio, è abbastanza veloce per la maggior parte delle applicazioni. Se cerchi puoi trovare articoli che lo confrontano con altri lingue e la maggior parte dei risultati presentati lo collocano nell'intervallo in cui sarà un problema solo quando si ha a che fare con i principali set di dati.

Nel campo della bioinformatica viene usato un po 'perché è ben supportato e c'è già una base di installazione per, uno dei vantaggi che Java ha è che puoi fare uno sviluppo abbastanza rapido con che non puoi fare con C. Se guardi i linguaggi usati per la bioinformatica (io personalmente uso R, Python e Java regolarmente) noterai che nessuno di questi è esattamente il più veloce e non è insolito che i set di dati in bioinformatica si imbattano in centinaia di gigabyte di informazioni. Alla fine, il tempo umano è ancora più prezioso e mentre le differenze di velocità sono evidenti, la dimensione dei set di dati tendono ad essere abbastanza grandi da correre comunque durante la notte.

Se fosse più facile scrivere un'interfaccia utente scattante in Java è abbastanza come se la percezione della velocità cadesse dal radar poiché la maggior parte delle persone non spinge le lingue abbastanza che la velocità è davvero un problema su un quotidiano base.

0
rjzii