2012-04-26 7 views

risposta

9

Sì, poiché la maggior parte delle ottimizzazioni vengono eseguite in fase di esecuzione da parte della JVM, il compilatore sta facendo molto poco per quanto riguarda l'ottimizzazione. Quindi il codice compilato con il vecchio compilatore Java trarrà ancora beneficio dalla nuova JVM.

Tuttavia ci sono alcune ottimizzazioni eseguite in fase di compilazione, come la sostituzione di consecutivi String concatenazioni con StringBuilder.

+0

Ciao Tomasz, grazie per la risposta. Avete qualche puntatore a leggere i materiali affermando quanto sopra? Qualcosa di ufficiale da Sun o Oracle sarebbe molto grande. – bungrudi

+0

@bungrudi: sfortunatamente, è solo una conoscenza comune di SO. Ma forse qualcun altro indicherà risorse impegnative? –

+0

+1 Non solo il compilatore 'javac' fa pochissime ottimizzazioni, ciò che fa non è cambiato molto da Java 1.4. Usando StringBuilder invece di StringBuffer è stato aggiunto in Java 5.0 (2004) ma la differenza è in genere molto piccola. –

1

Quasi tutte le ottimizzazioni in java si verificano nel jit e quindi dipendono solo dalla versione jvm che esegue l'applicazione. Il compilatore bytec di javac emette solo i bytecode più semplici possibili. Non penso che ci siano ottimizzazioni in questa fase, tranne forse per la concatenazione di stringhe usando StringBuilder/StringBuffer.

Java 6 e versioni successive possono utilizzare uno bytecode verifier più veloce e più semplice per le classi compilate con la versione di destinazione 6. Il compilatore javac crea ulteriori informazioni sui tipi di dati in ogni slot di stack, che il verificatore deve convalidare. Nelle versioni precedenti il ​​verificatore doveva dedurre questi tipi che sono più complessi. Questa modifica accelera solo il caricamento delle classi e non dovrebbe avere alcun impatto durante l'esecuzione effettiva del bytecode.

Penso che un'altra modifica al bytecode nella versione 5 o 6 era che il pool costante nel file di classe può fare riferimento a classi e interfacce. Ancora una volta, questo probabilmente influisce solo sul caricamento delle classi.

0

Non solo ci saranno semplicemente grandi guadagni in termini di prestazioni, ma anche tra le versioni di Java 6 ci sono grandi differenze. Ho rintracciato le versioni minori di Java 6 in un periodo di 18 mesi e ho visto un aumento del 15-20% proprio da quello.

Java 7 è fuori, ed è la versione di produzione preferita - c'è un motivo per cui non si vorrebbe andare a quella versione?

Oh, e un'ultima cosa. Se è necessario dimostrare i vantaggi della gestione, è necessario leggere molto sulla misurazione delle prestazioni delle applicazioni Java. Ho un articolo sul prossimo numero di maggio/giugno 2012 della rivista Oracle di Java, che è un vero 101 se ne hai bisogno. È un argomento molto sfuggente, quindi dovresti fare un sacco di letture o potresti ottenere numeri molto fuorvianti.

+0

L'app è un'applicazione legacy di WebSphere 6 (Java 1.4) che stiamo migrando a WebSphere 7. Il JDK "in bundle" è un 1.6.0_xx e non abbiamo il lusso del tempo libero per provare a cambiarlo in Java 7 (almeno per ora). Sto aspettando con impazienza il tuo articolo. – bungrudi

2

Come sottolinea Tomasz Nurkiewicz, la maggior parte dell'ottimizzazione viene eseguita dal compilatore JIT e si dovrebbero vedere i vantaggi delle prestazioni eseguendo su Java 6 anziché su Java 1.4. Tuttavia, questo non garantisce che otterrete i migliori risultati. È ancora possibile perdere i vantaggi se si utilizzano varianti (più vecchie) più lente delle strutture dati. per esempio. StringBuffer invece di StringBuilder, Vector invece di LinkedList, Hashtable invece di HashMap e così via ...

Puoi anche considerare la compilazione con il flag -deprecated per javac. Probabilmente vorrai sostituire i metodi deprecati poichè di solito significa che esiste un'alternativa più performante disponibile per ottenere la stessa cosa.

+0

bel puntatore sul flag -deprecato. +1 per questo. – bungrudi

Problemi correlati