Introducción: por qué el perfilado de TypeScript es importante para el rendimiento
\nCuando escribes una aplicación en TypeScript, puede funcionar rápido con datos pequeños, pero a medida que el proyecto crece comienzan a aparecer cuellos de botella — secciones de código que ralentizan la ejecución. El perfilado ayuda a encontrar estos puntos problemáticos y entender dónde se gasta más tiempo.
\nEn este artículo analizaremos cómo perfilar código TypeScript usando las herramientas integradas del navegador y Node.js. Aprenderás cómo encontrar funciones lentas, analizar la pila de llamadas y optimizar secciones críticas.
\nEl artículo está dirigido a desarrolladores principiantes que ya conocen los fundamentos de TypeScript y quieren mejorar el rendimiento de sus aplicaciones.
\n\nConceptos básicos del perfilado
\nEl perfilado es el proceso de recopilar datos sobre cómo se ejecuta un programa: cuánto tiempo toman las funciones, con qué frecuencia se llaman, qué recursos consumen.
\nEn el contexto de TypeScript, es importante entender varias métricas clave:
\n- \n
- Tiempo de ejecución — cuántos milisegundos toma cada función. \n
- Número de llamadas — con qué frecuencia se llama a una función. \n
- Memoria — cuánta memoria se asigna y libera. \n
- Pila de llamadas — la secuencia de llamadas a funciones. \n
Para perfilar código TypeScript se pueden usar tanto herramientas del navegador (Chrome DevTools) como utilidades de Node.js (por ejemplo, --inspect o clinic.js).
Herramientas para el perfilado de TypeScript
\nChrome DevTools para código del lado del cliente
\nSi tu aplicación TypeScript funciona en el navegador, la mejor herramienta son las Chrome DevTools integradas. Abre la pestaña Performance y presiona el botón de grabación. Realiza una acción en la página, detén la grabación y obtén una línea de tiempo.
\nEjemplo de análisis: ves que la función processData toma 300 ms. Esto es una señal para optimizar.
Node.js y el perfilador integrado
\nPara código TypeScript del lado del servidor (Node.js) usa la bandera --inspect o --prof. Por ejemplo:
node --inspect dist/app.js\nLuego abre chrome://inspect en el navegador y conéctate al proceso. Obtendrás las mismas capacidades de DevTools, pero para código del servidor.
clinic.js — una utilidad simple para Node.js
\nInstala clinic.js globalmente:
npm install -g clinic\nEjecuta el perfilado:
\nclinic doctor -- node dist/app.js\nLa utilidad mostrará un informe visual con recomendaciones.
\n\nEncontrando cuellos de botella en la práctica
\nEjemplo 1: Ordenamiento lento de un array
\nSupongamos que tienes una función para ordenar un array grande de objetos:
\ninterface User {\n id: number;\n name: string;\n age: number;\n}\n\nfunction sortUsers(users: User[]): User[] {\n return users.sort((a, b) => {\n // Comparación lenta de cadenas\n const nameA = a.name.toLowerCase();\n const nameB = b.name.toLowerCase();\n if (nameA < nameB) return -1;\n if (nameA > nameB) return 1;\n return 0;\n });\n}\nAl perfilar, notarás que toLowerCase() se llama en cada comparación, y puede haber O(n log n) de ellas. El cuello de botella es la conversión repetida de cadenas.
Optimización: convierte las cadenas previamente:
\nfunction sortUsersOptimized(users: User[]): User[] {\n return users\n .map(user => ({\n ...user,\n _lowerName: user.name.toLowerCase()\n }))\n .sort((a, b) => {\n if (a._lowerName < b._lowerName) return -1;\n if (a._lowerName > b._lowerName) return 1;\n return 0;\n