2009-11-12 11 views
10

Sto leggendo un po 'di materiale sul fatto che Java può essere più veloce di C++, e mi sono imbattuto la seguente citazione:Come può Java in linea oltre i limiti delle funzioni virtuali?

"Java può essere più veloce di C++, perché le squadre investigative comuni possono inline oltre i confini funzione virtuale."

(http://www.jelovic.com/articles/why_java_is_slow.htm)

Cosa significa? Significa che il JIT può effettuare chiamate di funzioni virtuali in linea (perché presumibilmente ha accesso alle informazioni del tempo di esecuzione) mentre C++ deve chiamare la funzione attraverso il suo vtable?

Grazie

Taras

risposta

9

La risposta alla tua domanda è Sì: questo è ciò che significa il testo citato.

Il JIT analizzerà tutte le classi caricate. Se è in grado di determinare che esiste un solo metodo che può essere chiamato in un dato punto, può evitare l'invio e (se appropriato) in linea il corpo del metodo.

Al contrario, un compilatore C++ non conosce tutti i possibili sottotipi e pertanto non può determinare se questa ottimizzazione può essere eseguita per un metodo (virtuale). (E quando il linker funziona, è troppo tardi ...)

Altre risposte hanno detto che è possibile eseguire questa ottimizzazione a mano in C++ ... ma questo presuppone che tu (il programmatore) possa fare il analizza te stesso e modifica i metodi da virtuale a non virtuale. Ma se ti sbagli, hai un bug da rintracciare.

A proposito, possiamo supporre che questa ottimizzazione sia utile per l'applicazione media Java. Se non lo fosse, i compilatori del JIT non lo avrebbero implementato. Dopotutto, una ottimizzazione senza valore renderà le applicazioni Java più lente.

+0

+1 per rispondere alla domanda effettiva – ykaganovich

+0

Un vantaggio è che getter e setter possono essere intradiati, ovvero protezione completa dell'astrazione (codifica per interfacce e tutto) senza pagare automaticamente una penalità ogni volta. –

2

Per quello che il suo valore, Java, C++, Assemblea fornirà relativamente le stesse prestazioni.

Sì, è possibile ottenere prestazioni migliori con C++, C o Asm handoptimzed ... tuttavia, per la maggior parte delle applicazioni disponibili (provare qualsiasi cosa al di fuori di app di grafica seria), non è il collo di bottiglia, e il minor costo di implementazione compensa qualsiasi calo percepito.

4

Poiché la compilazione di bytecode Java in codice macchina viene posticipata fino al runtime, è possibile che JVM esegua profile-guided optimization e altre ottimizzazioni che richiedono informazioni non disponibili fino a quando il codice non è in esecuzione. Ciò può includere anche la "deoptimizzazione", in cui viene revocata una ottimizzazione fatta in precedenza in modo che possano verificarsi altre ottimizzazioni.

Ulteriori informazioni a riguardo sono disponibili su adaptive optimization su Wikipedia, che include le ottimizzazioni relative all'inlinazione.

+0

Capisco che esistano compilatori C++ che possono utilizzare le informazioni del profilo per determinare se eseguire queste ottimizzazioni. Il vero problema con C++ è che il modello di link standard significa che il chiamante e il chiamato non sono necessariamente compilati insieme. –

+0

Sì, il nuovo gcc può fare questo tipo di ottimizzazione link-time (LTO). –

Problemi correlati