Al compilar el código que opera en los objetos List <>, el compilador debe usar llamadas de interfaz, que se preocupan más que las llamadas virtuales regulares en tipos concretos.
Por supuesto, en un fragmento de código donde el compilador ve el objeto que se está instanciando y puede probar que algo que se declara como una Lista <> es siempre un ArrayList <>, el compilador debería poder emitir un llamada regular en lugar de una llamada de interfaz, pero los métodos que no están en línea y operan en objetos ya instanciados no se beneficiarían de esta optimización.
La optimización de forma ubicua que acelera las llamadas virtuales, es decir, las memorias caché en línea (con frecuencia polimórfica Inline almacenamiento en caché o PIC, que no debe confundirse con el código independiente de posición), se beneficia de la observación de que las instancias de una única subclase se accede siempre a través una variable de cierto tipo declarado. En este escenario, después de que el código se haya estado ejecutando por un tiempo, el JIT puede adivinar de manera optimista que un objeto List <> solo será una ArrayList <>, generará una trampa en caso de que la suposición sea incorrecta y fracasará con ArrayList <> llamada.
Los procesadores modernos ejecutan la verificación muy rápidamente (porque son superescalares y tienen una buena predicción de bifurcación) por lo que no se da cuenta del costo de todas las llamadas a la llamada virtual e interfaz de implementación individual. Pero hace que la máquina virtual trabaje duro, instrumentando, generando y parcheando todo ese código.
Para el software de servidor que se ejecuta en estado estable en HotSpot es irrelevante, pero para un inicio rápido en un dispositivo móvil podría marcar la diferencia. No sé cuán buena es la VM de Google.
Un artículo agradable sobre él por el Dr. acantilado Click, Jr. (personalizado grande de hardware hierro, hotspot-deived VM): http://www.azulsystems.com/blog/cliff-click/2010-04-08-inline-caches-and-call-site-optimization
Y, por supuesto, "el almacenamiento en caché en línea" en la wikipedia.
"siempre ha aprendido que es mejor crear una ArrayList utilizando la interfaz de lista". Curiosamente, nunca había escuchado eso antes. ¿Cuál es la ventaja de hacerlo? –
@Brian si usa la interfaz tanto como sea posible, el código se desacoplará de la implementación de la lista. Facilitando la sustitución de la lista por otro objeto que solo implemente la interfaz de la lista. Como una extraña abstracción de base de datos u otra cosa. – Janusz
¿Cuándo los ejemplos siempre usaron las mejores prácticas? La mayoría de los ejemplos de MySQL/PHP están plagados de ataques de inyección SQL y otros problemas. La mayoría de los ejemplos en la web se realizan de tal manera que obtienes la mayor funcionalidad posible del código más bajo posible o con un código tan fácil de entender como sea posible, ignorando por completo las mejores prácticas, los posibles agujeros de seguridad y la comprobación de errores . – Kibbee