valueof tipos programacion parseo metodo lenguaje datos conversión conversiones conversion compatibilidad java performance casting

tipos - metodo valueof java



¿Hay algún costo de tiempo de ejecución para Casting en Java? (5)

¿Habría alguna diferencia de rendimiento entre estos dos trozos?

public void doSomething(Supertype input) { Subtype foo = (Subtype)input; foo.methodA(); foo.methodB(); }

vs.

public void doSomething(Supertype input) { ((Subtype)input).methodA(); ((Subtype)input).methodB(); }

¿Alguna otra consideración o recomendación entre estos dos?


Bueno, el código compilado probablemente incluye el elenco dos veces en el segundo caso, por lo que en teoría está haciendo el mismo trabajo dos veces. Sin embargo, es muy posible que un JIT inteligente resulte que está haciendo el mismo modelo con el mismo valor, por lo que puede almacenar en caché el resultado. Pero tiene que funcionar al menos una vez; después de todo, debe tomar una decisión sobre si se debe permitir que el reparto tenga éxito o si se lanza una excepción.

Como siempre, debe probar y crear un perfil de su código si le importa el rendimiento, pero yo personalmente usaría el primer formulario de todos modos, solo porque me parece más legible.


De acuerdo con este artículo , hay un costo asociado con el casting.

Tenga en cuenta que el artículo es de 1999 y le corresponde al lector decidir si la información aún es confiable.


En el primer caso :

Subtype foo = (Subtype)input;

se determina en tiempo de compilación, por lo que no hay costo en tiempo de ejecución.

En el segundo caso:

((Subtype)input).methodA();

se determina en tiempo de ejecución porque el compilador no lo sabrá. El jvm debe verificar si se puede convertir a una referencia de Subtype y si no arrojar ClassCastException etc. Por lo tanto, habrá algún costo.


Estoy de acuerdo con el comentario de Jon, hazlo una vez, pero por lo que vale en la pregunta general de "está echando caro", por lo que recuerdo: Java 1.4 mejoró esto notablemente con Java 5 haciendo moldes extremadamente económicos. A menos que esté escribiendo un motor de juego, no sé si es algo de lo que preocuparse más. Me preocuparía más sobre el auto-boxeo / unboxing y la creación de objetos ocultos en su lugar.


Sí. Los controles se deben hacer con cada lanzamiento junto con el mecanismo real de lanzamiento, por lo que lanzar varias veces costará más que lanzar una sola vez. Sin embargo, ese es el tipo de cosas que el compilador probablemente optimizaría. Se puede ver claramente que la entrada no ha cambiado su tipo desde el último lanzamiento y debería ser capaz de evitar múltiples lanzamientos, o al menos evitar algunas de las verificaciones de lanzamiento.

En cualquier caso, si realmente te preocupa la eficiencia, me pregunto si Java es el lenguaje que deberías usar.

Personalmente, yo diría usar el primero. No solo es más legible, sino que también facilita el cambio del tipo más adelante. Solo tendrá que cambiarlo en un lugar en lugar de cada vez que llame a una función en esa variable.