Pregunta

Me pregunto si hay cualquier diferencia de rendimiento entre

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

    y

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

Mirando el código de bytes generado, que parece tener diferencias. Es la JVM capaz de optimizar este código de bytes en tiempo de ejecución para tener ambas soluciones proporcionando mismas prestaciones?

En este caso simple, de la solución de golf 2 parece más apropiado, pero a veces yo preferiría solución al 1 por motivos de legibilidad y sólo quiero estar seguro de no introducir actuaciones "disminuye" en las secciones críticas del código.

¿Fue útil?

Solución

La creación de una variable temporal (sobre todo algo tan pequeño como una cadena) es intrascendente para la velocidad de su código, por lo que debe dejar de preocuparse por esto.

Trate midiendo el tiempo real empleado en esta parte de su código y apuesto a que encontrará que no hay diferencia de rendimiento en absoluto. El tiempo que tarda en llamar toString() e imprimir el resultado es mucho más largo que el tiempo que se necesita para almacenar un valor temporal, y no creo que encontrará una diferencia medible aquí en absoluto.

Incluso si el código de bytes se ve diferente aquí, es porque javac es ingenuo y su compilador JIT hace el trabajo pesado para usted. Si el código que realmente importa para la velocidad, entonces se ejecutará muchas, muchas veces, y su JIT lo seleccionará para la compilación de código nativo. Es muy probable que ambos compilar el mismo código nativo.

Por último, ¿por qué llama System.out.println() en el código de rendimiento crítico? Si hay algo que aquí va a matar a su rendimiento, esa voluntad.

Otros consejos

Si tiene secciones de código críticos que exigen un rendimiento, evitar el uso de System.out.println(). Hay más sobrecarga producida por ir a la salida estándar que alguna vez será con una asignación de variables.

Haga solución 1.

Editar : o solución 2

No hay ningún código * suficiente como para que la diferencia entre las dos muestras hace ninguna diferencia en absoluto crítico. Os animo a probar esto; ejecutar tanto unos pocos millones de veces, y registrar el tiempo necesario.

Escoja la forma más legible y fácil de mantener.

* Exagerando para el efecto. Si usted tiene suficiente código crítico, que ha estudiado para aprender esto.

El código de bytes generado es no una buena medida de la el rendimiento de una determinada pieza de código, ya que conseguirá analizado este código de bytes, optimizado y (en caso de que el compilador servidor) volvió a analizar y re-optimizado si se considera para ser un cuello de botella.

En caso de duda, utilice un generador de perfiles.

En comparación con salida en la consola, dudo que cualquier diferencia en el rendimiento entre los dos va a ser medible. No optimice antes de haber medido y confirmado que tiene un problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top