2012-06-09 24 views
6

En Java, lo caro que es para hacer un reparto:¿Qué tan caro es realizar una operación de lanzamiento Vs i ++?

(MyObject) IObject; 

frente:

i++; 

suponiendo "int i = N" precede.

EDIT:

caso omiso de mi comparación directa con (i ++) por un segundo, si lo haría por favor. Permítanme reformular esto en términos más generales: ¿qué tan caro es el casting en general? Elija su operación de referencia mejor que mi ingenuo ejemplo "i ++", tome una declaración de variable simple y una asignación, por ejemplo, ¿cómo se compara la ejecución de un reparto con eso en términos de bytecode/operations VM?

Utilicé i ++ como una vara de medir. Esa fue una muy mala idea. Cuando eligieron el "metro" como referencia, lo hicieron mucho mejor. ¿Hay una unidad de medición básica para el costo de operación en Java? Una JVM op? Supongo que esto dependerá del código nativo que Java op compila para ... por cierto, ¿qué tan caro es el casting? (A escoger la vara de medir para mí, soy malo en eso)

+6

¿Cuál es la conexión entre estas dos operaciones? Haces que parezca que pueden intercambiarse, de lo contrario, ¿por qué compararías su "costo"? – Tudor

+0

¿Qué? ... ¿qué estás tratando de hacer? – Brendan

+0

Guau .. -3 en unos minutos ... no es nuestra mejor hora. Estoy tratando de determinar qué tan caro es el casting en general Vs una operación trivial. – Robottinosino

Respuesta

1

yo haré una respuesta corta en la segunda parte (lo caro que está casting):

casting es muy barato y muy optimizado en el que cuenta . if (o instanceof Clazz) ((Clazz)o) es absolutamente gratis (el reparto, no el cheque en sí).

En general, si el molde puede ser probado por el compilador y doblado constantemente no costará nada. De lo contrario, se necesita una carga en el encabezado del objeto para determinar la clase. Algunas JVM pueden usar un poco del puntero para almacenar la clase, es lo importante que es. De todos modos, incluso una carga probablemente sea barata y llegue al caché L1. El hardware predice prácticamente todas las derivaciones de moldes; imagine qué improbable es obtener ClassCastException (la vía lenta) y no importa la optimización en este caso.

Las matrices son en general significativamente más rápidas que las colecciones framerwork y sus genéricos por muchas razones, pero el casting juega un papel muy pequeño.

Última: 'medida' flagrante, es decir, microbenchmark es a menudo una idea pésima, medir el rendimiento de la aplicación como un todo es el camino correcto a seguir. Microbenchmarks requiere una comprensión profunda de cómo JVM optimiza (o no) y debe asegurarse de que comparta lo que realmente necesita. Overall it's an art on its own.

Cuestiones relacionadas