Un Inline Cache (IC), también conocido como Polymorphic Inline Cache (PIC) cuando maneja múltiples tipos, es una técnica de optimización de tiempo de ejecución empleada por motores de lenguajes dinámicos (como JavaScript, Python o Ruby) y JIT compilers. Su propósito principal es reducir la sobrecarga asociada con operaciones dinámicas, como el despacho de métodos virtuales o la resolución de propiedades de objetos, que requieren búsquedas en tiempo de ejecución. Un IC funciona insertando un pequeño fragmento de código en el punto de llamada que, la primera vez, realiza la búsqueda completa y luego reescribe el propio código para "recordar" el resultado. En subsiguientes llamadas con el mismo tipo de receptor, el IC puede saltar directamente al método o propiedad correcto, evitando la búsqueda costosa.

Los Inline Caches son una piedra angular en la optimización de rendimiento de muchos runtimes de lenguajes dinámicos. Por ejemplo, el motor V8 de JavaScript (utilizado en Chrome y Node.js) hace un uso extensivo de ICs para acelerar el acceso a propiedades y el despacho de llamadas a funciones. De manera similar, la JVM (Java Virtual Machine) utiliza ICs para optimizar las llamadas a métodos virtuales, especialmente en el contexto de lenguajes dinámicos que se ejecutan sobre ella (como Groovy o Scala). Otros ejemplos incluyen PyPy (una implementación JIT de Python) y Rubinius (una implementación de Ruby), que emplean ICs para mejorar significativamente la velocidad de ejecución al reducir la latencia de las operaciones dinámicas.

Para un Arquitecto de Sistemas, comprender los Inline Caches es crucial al diseñar o evaluar sistemas que dependen de lenguajes dinámicos o plataformas con JIT compilers. Los ICs demuestran el trade-off entre la flexibilidad del lenguaje y el rendimiento en tiempo de ejecución. Un sistema que hace un uso intensivo de polimorfismo o acceso dinámico a propiedades se beneficiará enormemente de runtimes con ICs eficientes. Sin embargo, un uso excesivo de tipos heterogéneos en puntos de llamada críticos puede llevar a "megamorphic" ICs, que son menos efectivos y pueden degradar el rendimiento. Los arquitectos deben considerar cómo el diseño de sus clases y la estructura de sus datos impactan la "monomorphicidad" de los puntos de llamada, lo que a su vez afecta la eficacia de los ICs y, en última instancia, el rendimiento general del sistema. Es una consideración clave para optimizar la latencia y el throughput en aplicaciones de alto rendimiento.