Funcionamiento de la colada en diversos niveles al tirar abajo
Supongamos que tenemos tres (o más) clases
Clase pública A {}
- ¿Hay alguna manera de agregar parámetros de consulta a cada solicitud con Retrofit 2?
- ORMLite JOINs o mapeo automático de rawQuery
- Proceso para comprimir una imagen para subirla a un servidor en Android
- Implementación de un grupo de subprocesos dentro de un servicio
- ¿Alternativas para DOM API en Android?
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.
- Obtención del valor del sensor de luz
- ¿Puedo hacer un juego HTML5 para Android?
- Android: Modo Jumbo vs Multidex
- Error "No se puede crear instancias de actividad"
- Android searchview setOnActionExpandListener en Honeycomb 3.2
- Android: Cambiar el tamaño de los mapas de bits sin perder calidad
- ¿Cómo funciona la VPN en Android y la lista de API disponibles? (chupete)
- ¿Cómo leer eficientemente un objeto Bitmap en una matriz de números enteros bidimensionales?
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.
- Barra de Acción de Android Buscar con listview
- Modificación de la interfaz de usuario de la aplicación individual (teléfono, contactos) en ICS AOSP