Funcionamiento de la colada en diversos niveles al tirar abajo

Supongamos que tenemos tres (o más) clases

Clase pública A {}

La clase pública B extiende A {}

Public class C extends B implementa G {}

Suponga que cada clase tiene sus propios 20 (o más) métodos.

¿Es casting a C vs casting a A tiene mayor impacto en el rendimiento? ¿Cómo funciona el casting de Java bajo el capó?

¿Tiene que comprobar para todos los métodos y campos para la presencia por reflexión cuando el casting hacia abajo?

Editar: ¿El tamaño de las clases (número de campos y métodos) afecta el rendimiento al emitir? Estoy interesado en OpenJRE y Dalvik .

Para la referencia, sé que upcasting se puede hacer sin problemas.

El rendimiento del casting depende de la implementación de JVM.

El JLS 5.5 sólo determina los requisitos para el casting (que incluye un algoritmo recursivo), pero no establece ningún requisito en la implementación. En realidad, las reglas de emisión en tiempo de ejecución en 5.5.3 también se determinan de la misma manera. Todas las implementaciones JVM que producen el mismo resultado que el algoritmo propuesto se aceptan como una JVM adecuada.

Generalmente, la conversión a C toma un poco más de tiempo ya que la JVM debe examinar el tipo de tiempo de ejecución del objeto. Cuando el casting a A no tiene ninguna razón para hacer la misma verificación, ya que B extiende A

En realidad, la JVM no se preocupa por el número de métodos y campos. Sólo compara la jerarquía de tipos, la misma que se puede examinar con reflexión ( o.getClass() )

Hice un código de ejemplo como sigue, un downcast, luego un upcast:

 Object o = new Integer(1); Integer i = (Integer) o; Object o2 = i; 

El bytecode compilado es el siguiente:

  0 new java.lang.Integer [16] 3 dup 4 iconst_1 <-- 1 as a parameter to the constructor 5 invokespecial java.lang.Integer(int) [18] <-- constructor 8 astore_1 [o] <-- store in 'o' 9 aload_1 [o] 10 checkcast java.lang.Integer [16] <-- DOWNCAST CHECK, SPECIAL BYTECODE 13 astore_2 [i] 14 aload_2 [i] 15 astore_3 [o2] <-- WITH UPCAST NO CHECK 

Por lo tanto, hay una instrucción JVM específica que comprueba el elemento en la parte superior de la pila con una clase dada.

Con upcast, no hay ningún cheque en absoluto.

El tamaño de las clases (número de campos, métodos, huella real) no importa , porque el casting examina la Class (los metadatos, que en realidad es un objeto).

El número de niveles de jerarquía, y el número de interfaces implementadas (si se echa a una interfaz), porque es el árbol de herencia / implementación que se puede recorrer para comprobarlo.

Me sorprendería si no hubiera algún tipo de caché para esta comprobación.

Para una arquitectura detallada de checkcast (que se mencionó en otra respuesta como un mecanismo JVM para downcasting) en HotSpot, eche un vistazo a este documento de conferencia:

Comprobación rápida de subtipos en la JVM HotSpot

Una cita del resumen:

En pruebas de referencia reales, nuestra técnica realiza verificaciones completas de subtipos en 3 instrucciones (sólo 1 referencia de memoria) esencialmente todo el tiempo. En raras ocasiones, se vuelve a una exploración de matriz más lenta. El uso de la memoria es moderado (6 palabras por clase) y puede ser cambiado por tiempo.

Así que si usted no escribe un código de muy bajo nivel con un montón de casting, el impacto es insignificante.

  • ¿hay un acceso directo en eclipse para generar recursos (constructores, get / set ...)
  • Aplicación de Android que requiere archivos de datos grandes
  • ¿Cómo puedo detectar un clic en un oyente onTouch?
  • Siempre ejecutando proguard antes de Android dex'ing en Eclipse
  • Base de datos onUpgrade - oldVersion - newVersion
  • ¿Cómo iniciar la aplicación Telegram desde mi propia aplicación Android?
  • Robolectric usando Fragments y ActionBarCompat NullPointerException
  • Cómo generar un código de hash exclusivo para la entrada de cadena en android ...?
  • ¿Existen bibliotecas similares al proyecto Three20 para Android?
  • ¿Cómo implementar la función .get con FutureTask o BackgroundTask usando android?
  • Java REST cliente API para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.