TypeScript al máximo: cómo acelerar el código 10 veces

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Su código TypeScript funciona lento? Es hora de mirar bajo el capó

\n\n

Escribió un código perfecto en TypeScript. Los tipos están establecidos, las abstracciones son bonitas, las pruebas están en verde. Pero el servidor de producción «se ralentiza» y los componentes de React se vuelven a renderizar con retraso. ¿Le suena familiar? A menudo el problema no está en la lógica, sino en el rendimiento de TypeScript, que no notamos hasta que la carga se vuelve real.

\n\n

En este artículo no hablaremos de la velocidad de compilación, ese es un tema para otra conversación. Nos centraremos en el rendimiento en tiempo de ejecución: cómo perfilar el código terminado, encontrar los «cuellos de botella» y optimizar TypeScript para que la aplicación vuele. Descubrirá por qué map es 10 veces más rápido que forEach, cómo el GC mata los FPS y qué herramientas de perfilado debería llevar siempre consigo.

\n\n

Herramientas de perfilado de TypeScript: desde Chrome hasta Node.js

\n\n

Antes de optimizar algo, hay que entender dónde se pierden los milisegundos. Para ello, en TypeScript existen tres enfoques principales para el perfilado.

\n\n

1. Pestaña de Rendimiento de Chrome DevTools

\n

Si escribe frontend, su mejor amigo es la pestaña Performance en Chrome DevTools. Grabar un perfil le mostrará una imagen completa: qué JavaScript se ejecuta durante más tiempo, cuánto tiempo lleva la recolección de basura y dónde se producen las «caídas» de FPS. TypeScript después de la compilación es JavaScript puro, por lo que el perfilador ve exactamente lo que se está ejecutando.

\n\n
// Ejemplo: perfilamos un cálculo "pesado" en el navegador\nfunction processLargeArray(items: number[]): number[] {\n  const result: number[] = [];\n  for (let i = 0; i < items.length; i++) {\n    // Simulación de trabajo pesado\n    result.push(items[i] * Math.sqrt(items[i]));\n  }\n  return result;\n}\n\nconsole.time('processLargeArray');\nconst data = Array.from({ length: 100000 }, (_, i) => i);\nprocessLargeArray(data);\nconsole.timeEnd('processLargeArray');\n
\n\n

Abra la pestaña Performance, presione Record, ejecute este código — y verá el tiempo exacto de ejecución, así como la pila de llamadas. Si la función tarda más de 100ms, es motivo para pensar en optimizar el código TypeScript.

\n\n

2. Perfilador de Node.js (--prof y --inspect)

\n

Para el backend en Node.js con TypeScript, use el perfilador integrado. Ejecute la aplicación con la bandera --prof:

\n\n
node --prof dist/server.js\n
\n\n

Después de que termine el trabajo, se crea un archivo isolate-*.log. Conviértalo a un formato legible:

\n\n
node --prof-process isolate-*.log > processed.txt\n
\n\n

En el archivo verá qué funciones (incluidas las de TypeScript compilado) consumen más CPU. Esta es una herramienta indispensable para el perfilado de TypeScript en producción.

\n\n

3. Perfilador de CPU V8 a través de Clinic.js

\n

Para un análisis más visual, use Clinic.js. Dibuja hermosos gráficos de llama y muestra dónde el código TypeScript «se ralentiza».

\n\n
npm install -g clinic\nclinic doctor -- node dist/server.js\n
\n\n

Después de las pruebas, abra el informe HTML — verá qué funciones ocupan el 90% del tiempo. A menudo son lugares inesperados: por ejemplo, llamadas frecuentes a JSON.parse o bucles no optimizados.

\n\n

Las 5 mejores técnicas de optimización de código TypeScript

\n\n

Cuando el perfilador haya mostrado los «puntos calientes», es hora de ponerse manos a la obra con la optimización. Aquí hay cinco formas probadas de acelerar TypeScript que uso en mis proyectos.

\n\n

1. Evite map si necesita forEach

\n

Suena extraño, pero map crea un nuevo array, incluso si no lo usa. Si solo necesita realizar una acción, use forEach o el clásico for.

\n\n
// Lento — crea un array innecesario\nconst ids = users.map(user => {\n  sendEmail(user.email);\n  return user.id;\n});\n\n// Rápido                

Blogs

Book Recommendations