Domanda

Mi chiedo se ci sono delle differenze di prestazioni tra

  1. String s = someObject.toString (); System.out.println (s);

    e

  2. System.out.println (someObject.toString ());

Guardando il bytecode generato, sembra avere differenze. È la JVM in grado di ottimizzare il bytecode in fase di esecuzione di avere entrambe le soluzioni fornendo stesse prestazioni?

In questo semplice caso, di una soluzione da golf 2 sembra più appropriato, ma a volte io preferirei la soluzione 1 per scopi di leggibilità e voglio solo essere sicuro di non introdurre la performance "diminuisce" in sezioni di codice critiche.

È stato utile?

Soluzione

La creazione di una variabile temporanea (in particolare qualcosa di piccolo come una stringa) è irrilevante per la velocità del codice, così si dovrebbe smettere di preoccuparsi di questo.

Prova misurando il tempo effettivo trascorso in questa parte del codice e scommetto che troverete non c'è alcuna differenza di prestazioni a tutti. Il tempo necessario per chiamare toString() e stampare il risultato prende molto più a lungo rispetto al tempo necessario per memorizzare un valore temporaneo, e non credo che troverete una differenza misurabile qui a tutti.

Anche se il bytecode aspetto diverso qui, è perché javac è ingenuo e il compilatore JIT fa il lavoro pesante per voi. Se questo codice è importante per la velocità, allora verrà eseguito molte, molte volte, e il vostro JIT selezionerà per la compilazione di codice nativo. E 'molto probabile che entrambi questi compilare lo stesso codice nativo.

Infine, perché stai chiamando System.out.println() nel codice prestazioni critiche? Se qualcosa qui sta per uccidere le prestazioni, che la volontà.

Altri suggerimenti

Se si dispone di sezioni di codice critiche che richiedono prestazioni, evitare l'uso di System.out.println(). Non v'è più in testa sostenute andando sullo standard output che ci sia mai sarà con un'assegnazione di variabile.

Fare soluzione 1.

Modifica : o una soluzione 2

Non v'è alcun codice * sufficiente che la differenza tra le due campioni fa alcuna differenza critica. Vi incoraggio a testare questo; eseguire sia qualche milione di volte, e registrare il tempo impiegato.

Pick la forma più leggibile e gestibile.

* Esagerando per effetto. Se si dispone di codice abbastanza critica, che hai studiato per imparare questo.

Il bytecode generato è non una buona misura della performance di un determinato pezzo di codice, dal momento che questo bytecode otterrà analizzato, ottimizzato e (nel caso del compilatore server) ri-analizzati e ri-ottimizzato se si considera un collo di bottiglia.

In caso di dubbio, utilizzare un profiler.

Rispetto per l'output alla console, dubito che qualsiasi differenza di prestazioni tra i due sta per essere misurabile. Non ottimizzare prima di aver misurato e confermato che hai un problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top