Estoy tratando de saber si, y en qué punto y en qué medida, la siguiente función de TypeScript está optimizada en su camino desde JavaScript al código de máquina en algún entorno V8, por ejemplo:
function foo(): number { const a = 1; const b = a; const c = b + 1; return c; }La función opera con constantes sin parámetros por lo que siempre es equivalente a la siguiente función:
function foo(): number { return 1 + 1; } Y finalmente, en cualquier código de bytes o código de máquina, simplemente asigne el número 2 a algún registro, sin asignaciones intermedias de valores o punteros de un registro a otro.
Suponiendo que optimizar una lógica tan simple sea trivial, podría imaginar algunos pasos potenciales en los que podría suceder:
¿Ocurre esta optimización o es una mala práctica desde el punto de vista del rendimiento asignar expresiones a constantes para una mejor legibilidad?
(Desarrollador V8 aquí.)
¿Ocurre esta optimización?
Sí, sucede siempre y cuando la función se caliente lo suficiente como para optimizarla. De hecho, el código optimizado solo escribirá 2 en el registro de retorno.
Los analizadores, los intérpretes y los compiladores de referencia normalmente no aplican ninguna optimización. La razón es que identificar oportunidades para optimizaciones tiende a tomar más tiempo que simplemente ejecutar algunas operaciones, por lo que hacer ese trabajo solo vale la pena cuando la función se ejecuta mucho.
Además, si tuviera que establecer un punto de interrupción en medio de esa función e inspeccionar el estado local en un depurador, querría ver las tres variables locales y cómo se asignan paso a paso, por lo que los motores deben tener en cuenta esa posibilidad también.
¿Es una mala práctica desde el punto de vista del rendimiento asignar expresiones a constantes para una mejor legibilidad?
No, está totalmente bien hacer eso. Incluso si le costó una instrucción de máquina o dos, tener un código legible suele ser más importante.
Esto es cierto en particular cuando una implementación más legible le permite darse cuenta de que podría simplificar todo el algoritmo. Las CPU pueden ejecutar miles de millones de instrucciones por segundo, por lo que guardar un puñado de instrucciones no cambiará mucho; pero si tiene la oportunidad de, por ejemplo, reemplazar un escaneo lineal con una búsqueda en tiempo constante, eso puede ahorrar suficiente trabajo computacional (una vez que sus datos sean lo suficientemente grandes) para marcar una gran diferencia.