|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | ||
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 1234
|
[Compiler] Java just-in-time vs C++
E' vero che il compilatore on the fly di java chiamato just-in-time compiler, riesce a tenere testa (a livello di prestazioni) ad un applicazione scritta in c++ che non ha bisogno di un interprete come la VM?
Riporto la fonte. Libro Core Java Volume I Fundamentals: Quote:
Quote:
Ultima modifica di hollywoodundead : 10-08-2013 alle 23:08. |
||
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Direi che la risposta c'è già in quello che hai citato
"and in some cases, they will run faster." C'è un dibattito che dura da anni sulle performance dei compilatori just-in-time vs aot. A meno di seri problemi nello sviluppo di un compilatore jit, è vero che ci sono casi in cui un programma jitted è più veloce di uno compilato aot. I motivi sono legati principalmente alle possibilità che hanno i compilatori jit di realizzare ottimizzazioni impossibili per un compilatore aot. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Il problema e' che i test che danno i JIT pari sono per certi versi una presa per il c**o - perche' non testano codice idiomatico del linguaggio.
Nel senso, se prendi codice C e lo traduci paro paro in codice Java e' molto probabile che i tempi viaggino tra 0.9x e 1.5x, che e' un ottimo risultato... ma questo e' un test puramente per il JIT e la VM che non tiene conto ne' delle performance del GC, ne' di quelle della libreria... semplicemente non e' il codice che scriverebbe un programmatore Java tipico. Ad esempio in Java rimane molto costoso creare piccoli oggetti come Vettori, Colori etc, rispetto a C++... perche' a parte new e delete creare decine di oggetti, indipendentemente dalle dimensioni e' un problema per il garbage collector. E' anche molto costoso fare chiamate a funzioni, dato che di default sono tutte virtuali (non a caso non c'e' l'overload degli operatori - decisero di non metterlo per "incoraggiare" la gente a sommare le cose a manina In piu' le performance della libreria standard fanno abbastanza schifo e vanno a sbattere contro tutti i limiti di Java stesso (oh the irony), quindi comunque si finisce a usare gli array C-style. In finale, se usi Java come un linguaggio di alto livello e' lento. Se lo usi a basso livello e' veloce. Non lo avrebbe mai detto nessuno
Ultima modifica di Tommo : 11-08-2013 alle 02:29. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 1234
|
Quote:
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
|
Aggiungo che compilatori più avanzati come GCC e VC++ (MS) hanno qualcosa che si avvicina molto a JIT: profile guided optimizations
http://blogs.msdn.com/b/vcblog/archi...ation-pgo.aspx Compilatori JIT come la JVM non sfruttano neanche "novità" introdotte dalle cpu 10 anni fa, come il supporto alla vettorizzazione Inoltre come detto da Tommo la JVM di impone uno stile "generico" di allocamento imposto dalla implementazione del GC scelta all'avvio In linguaggi con compilatori AOT solitamente manca un GC (alcuni è presente ma disattivabile come in D, altri come Go non puoi gestire la memoria da te) Un GC non solo impone dell'overhead quando fa il suo lavoro (e con heap sui 4GB, la JVM può farti aspettare anche un paio di minuti Ma ancora più importante non puoi creare il tuo stile di allocalmento specifico per il problema che ti stai affrontando -- che è dove le performance iniziano a brillare (custom allocator) Personalmente, non ho mai visto codice "uguale" sulla JVM battere un compilatore con le giuste flags JIT al momento è un pò come GC: è da 30 anni che si dice, che un giorno saranno più veloci della loro controparte
__________________
In a world without fences, who needs Gates? Power by: Fedora 8 - Mac OS X 10.4.11 Ultima modifica di nico159 : 11-08-2013 alle 18:56. |
|
|
|
|
|
#6 | |||
|
Senior Member
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
|
Quote:
http://sealedabstract.com/rants/why-...apps-are-slow/ Quote:
Quote:
__________________
In a world without fences, who needs Gates? Power by: Fedora 8 - Mac OS X 10.4.11 |
|||
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 1234
|
Possiamo dire quindi che l'unica differenza per quanto riguarda le prestazioni tra java e c++ riguarda fondamentalmente la gestione della memoria, automatica in java tramite il GC e manuale in c++ delegata allo sviluppatore? Forse un tempo java era stato pensato, essendo un linguaggio multipiattaforma per eseguire programmi molto toy, quindi senza particolari richieste di prestazioni, vedi ad esempio Java ME per il mobile. Tuttavia oggi anche le applicazioni piu stupide richiedono prestazioni e gestione della memoria piu che buone per poter funzionare decentemente, il GC di allora non ha subito grosse novita in termini di gestione automatica della memoria. Con il passare del tempo voi penserete che elimineranno il GC quelli di java per implementare una gestione della memoria ibrida come già avviene con l'objective-c e l'ARC,oppure la gestione di memoria da parte del GC andrà a peggiorare con il passare degli anni?
|
|
|
|
|
|
#8 | |||||
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
come fatto notare da nico159, la jvm hotspot no supporta nemmeno la vettorizzazione...in questo caso si tratta di un modo sicuro per rendere un programma più lento e senza fare nemmeno tanti sforzi Quote:
loro accettano una penalizzazione in termini di performance, ma ci si guadagna in termini di tempi di sviluppo ma è una situazione comune a tutti i linguaggi di un certo tipo, a partire da c# fino a python, php, ruby si paga qualcosa sul fronte performance, per guadagnare qualcosa sul fronte dei tempi di sviluppo Quote:
più core, più gigahertz, più ram Quote:
e comunque le implementazioni della jvm sono tantissime, alcune decisamente migliori di hotspot ad esempio c'è zing che ha un gc pauseless ( niente lag improvvisi la stessa dalvik è profondamente diversa dalla jvm di oracle Quote:
magari le performance per core peggioreranno, ma si rimedierà usando i tanti core a disposizione |
|||||
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 1234
|
Quote:
|
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
Sul rendere un gc più performante è possibile, ma per niente banale. Si tratta di campi in cui si fa ancora molta ricerca e ci sono ancora molte discussioni accese. |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 1234
|
Quote:
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: May 2008
Città: Seattle (WA)
Messaggi: 306
|
E per quanto riguarda JRockit qualcuno ne sa qualcosa?
__________________
"Considerate la vostra semenza fatti non foste a viver come bruti ma per seguir virtute e canoscenza" |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: May 2008
Città: Seattle (WA)
Messaggi: 306
|
Rilancio con un'altra domanda... Rivolta a chi di Assembly ne capisce piu di me (il primo che mi viene in mente è cdmauro... ma penso che per quante ne so io il mio gatto ha una maria in più)
Queste ottimizzazioni (es vettorizzazione) non vengono fatte perché nessuno si è messo li a implementarle oppure perché sono troppo dispendiose da fare a runtime, cioè un compilatore standard può "metterci il tempo che vuole e occupare la memoria che vuole" mentre un compilatore JIT deve tener conto che ha il programma in esecuzione... Detto questo non converrebbe fare una sorta di cache locale con l'assembly generato al primo avvio ad esempio... e poi fare ottimizzazioni su di essa quando il programma non ha richieste particolari di CPU?
__________________
"Considerate la vostra semenza fatti non foste a viver come bruti ma per seguir virtute e canoscenza" |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Sto partendo per la Germania, quindi ho difficoltà a scrivere con lo smartphone, per cui sarò sintetico.
Si, si può fare ciò che chiedi, ma... qualcuno deve rimboccarsi le maniche. Ed è anche corretto che un compilatore JIT possa generare una prima versione "grezza", per poi affinare e generare codice ancora più ottimizzato man mano che raccoglie informazioni a runtime. Ci sono parecchi studi in merito; cerca HP dynamo. Comunque il vantaggio di usare un intermediate language al posto binario puro è rimane possibile eseguire una compilazione AoT ottimizzata per quella particolare piattaforma, grazie alle maggiori informazioni (e astrazione). Ad esempio compilare per un'architettura inesistente al momento della compilazione in IL. Qualcosa del genere si potrebbe anche fare partendo dal binario puro, ma sarebbe molto più complicato.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
* Per ottenere certi risultati bisogna scrivere codice Java in modo meno idiomatico (tipicamente "alla C"). Questo puo' non essere un problema se si decide di farlo solo nelle parti piu' critiche per le performace * Prima o poi bisogna usare delle librerie e queste possono avere performance buone o performance cattive. In particolare pero' nota che le librerie standard del C++ sono state scritte con le performance in mente, per cui anche se piu' difficili da utilizzare mediamente permettono di spremere meglio le risorse della macchina. Quelle di Java il piu' delle volte sono state sviluppate con la facilita' e correttezza d'uso come prima regola. * Fattore "Enterprise". In un linguaggio umano, se devi generare delle immagini server-side userai una libreria con cui crei un oggetto PngImage, manipoli i Pixel, e la salvi su un array di byte per mandarlo al client. In Java, molto probabilmente dovrai utilizzare un generico MultiMediaObjectGenerator che potrai modificare accedendo ai suoi MultiMediaItemPart , e che poi manderai al client con un qualsiasi AbstractCommunicationChannel. Tutti e tre descritti da specifiche diverse, ognuno implementato da cinque librerie diverse. Cosi' quando vorrai invece che mandare delle immagini via tcp vuoi mandare degli mp3 via smtp, potrai farlo "solo" cambiando le annotations delle tue classi. Basta che non ti lamenti delle performance, o degli stack trace da 100 e piu' metodi, di cui forse 2 sono stati scritti da te.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Visto che storicamente le librerie performanti sono sempre state scritte in Fortran, C, C++, risulta molto piu' comodo utilizzare un linguaggio di scripting che si appoggi a queste (Python, ad esempio ma non solo) che non Java.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Quote:
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 1234
|
OT: cidimauro è un altro dei tanti in fuga per l'estero, in questo caso the germany?
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Sì, Ulm per la precisione. Non potevo far morire di fame la mia famiglia.
In Sicilia è molto difficile trovare un lavoro, e tante volte viene schiavizzato. Spostarmi dalla Sicilia verso Roma o in sù avrebbe significato scendere comunque nella mia terra un paio di volte l'anno, prendendo uno stipendio che mi avrebbe permesso di sopravvivere. Allora tanto vale espatriare, perché c'è tutto da guadagnare. Intanto basta uscire appena fuori dall'Italia e il salario è molto più elevato (ovviamente in paesi come Svizzera, Germania, ecc.; in Europa la situazione non è tutta la florida). Poi anche perché il valore e il merito vengono apprezzati, premiati, e... molto ricercati. Cercando lavoro all'estero, se sei discretamente bravo, la situazione diventa l'opposto che in Italia: a volte hai l'imbarazzo della scelta, e spesso sono le aziende che cercano te e non il viceversa. Per non parlare poi dell'ambiente di lavoro, ma in generale anche dell'ambiente (civile) in cui vivi: i servizi funzionano MOLTO bene, c'è parecchia pulizia, ordine, e rispetto degli altri. Ovviamente non è tutto perfetto, ma la differenza con l'Italia è lampante. Qui ti preoccupi se l'autobus è in ritardo di un paio di minuti; e se non sei presente alla fermata all'orario previsto, c'è una discreta possibilità che tu l'abbia perso perché l'autista ha spaccato il secondo; ma lo stesso autista si ferma e ASPETTA alla fermata se per caso è arrivato troppo presto alla tappa prevista (ha un monitor LCD touchscreen in cui è mappato tutto, secondo per secondo). Chi fosse ancora indeciso sul da farsi, può immaginare, quindi, quale sia il mio consiglio. Tornando al topic, rispondo al volo a marco.r su un punto (sul resto mi trovo sostanzialmente d'accordo). La libreria standard C++ non è stata pensata per le prestazioni. Ricordo che per lo meno per il test della presenza di un elemento in un set oppure di una chiave in una mappa, il tempo era O(log n) e non O(1), come invece capita in altri linguaggi. Non so se la situazione è cambiata in questi anni, per cui mi fermo qui.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Jan 2009
Messaggi: 1234
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:39.




















