Introducción
En el mundo de los entornos JavaScript del lado del servidor, Node.js ha seguido siendo el estándar de facto durante más de una década, ampliamente utilizado en sistemas de producción a gran escala en una variedad de dominios. Sin embargo, en los últimos años, han surgido tiempos de ejecución alternativos como Deno y Bun con sus ventajas de rendimiento reclamadas y su arquitectura moderna.
Deno, introducido por el creador authentic de Node.js, fue diseñado para abordar las limitaciones de Node.js ofreciendo una seguridad mejorada, un sistema de módulo moderno y soporte de mecanografiado y soporte de mecanografiado. BUN, por otro lado, es un participante más nuevo que se centra principalmente en la ejecución de alto rendimiento, los tiempos de inicio rápidos y una cadena de herramientas integrada. Tanto Deno como BUN presentan puntos de referencia que sugieren mejoras sustanciales de rendimiento sobre Node.js (a veces 4x a 5x).
Sin embargo, estos puntos de referencia se basan con frecuencia en ejemplos altamente simplificados, como los servidores HTTP “Hey World”, que no reflejan las complejidades de las aplicaciones del mundo actual.
Para comprender y confirmar las afirmaciones, este artículo presenta un análisis de rendimiento comparativo de Node.js, Deno y BUN utilizando un estudio de caso realista: un servicio de acortador de URL. A diferencia de los puntos de referencia mínimos, esta aplicación simula una carga de trabajo de grado de producción que implica enrutamiento, validación de entrada, acceso a la base de datos y operaciones asincrónicas.
El objetivo de esta investigación es evaluar si la brecha de rendimiento publicada entre estos tiempos de ejecución aún se puede ver en condiciones prácticas y determinar si las afirmaciones de rendimiento superior son cierta cuando se aplican a casos del mundo actual.
Al evaluar estos tiempos de ejecución bajo cargas de trabajo del mundo actual, este artículo tiene como objetivo validar las afirmaciones, ayudando a los desarrolladores y arquitectos a elegir el tiempo de ejecución adecuado para sus próximos proyectos.
Configuración de prueba
Todos los puntos de referencia se realizaron en un MacBook Professional con un chip Apple M2, con 12 núcleos de CPU y 16 GB de RAM.
Para garantizar la generación de carga de alta calidad, la ampliamente reconocida Bombardero Se utilizó la herramienta. La herramienta se personalizó para enviar una URL aleatoria y única en el cuerpo de solicitud, formateada como una cadena JSON.
Bombardier se configuró para simular una carga constante de 100 conexiones concurrentes, completando un complete de 1 millones de solicitudes por prueba.
Se utilizaron las siguientes versiones de software program, todo actualizado al momento de la prueba:
- Nodo.js: v24.4.1
- Deno: v2.4.2
- Bollo: v1.2.18
Para cada tiempo de ejecución, se seleccionó el marco internet disponible más rápido para garantizar un rendimiento óptimo:
- Nodo.js Aplicación: construido con Rápido
- Deno Aplicación: construido con Honor
- Bollo Aplicación: construido con Elysia
Todas las pruebas interactuadas con un Postgresql Base de datos, un sistema de base de datos relacional de objetos de código abierto ampliamente adoptado con más de 35 años de desarrollo. PostgreSQL es conocido por su confiabilidad, conjunto de características extensas y un fuerte rendimiento.
Una sola mesa llamada shortenedurls
se usó para todas las operaciones de la base de datos. Esta tabla almacena las URL originales y acortadas. Su estructura es la siguiente:
Antes de cada prueba, la tabla se trunca para que el índice no sea de gran tamaño y ralentice la aplicación que se ejecuta más adelante en el ciclo de prueba.
Aplicaciones
Cada aplicación utiliza un marco internet distinto, lo que resulta en ligeras diferencias en la implementación de la aplicación. Sin embargo, la funcionalidad central sigue siendo consistente. Se ha elegido una aplicación de acortador de URL para la evaluación comparativa, ya que representa un caso de uso del mundo actual y permanece lo suficientemente easy para las pruebas controladas.
La aplicación evalúa el rendimiento en las siguientes operaciones:
- JSON analizando de la solicitud entrante
- Validación de solicitud
- Base de datos leída a través de un ORM
- Construcción de la respuesta JSON
La implementación para cada aplicación se detalla a continuación:
Nodo.js
Deno
Bollo
Resultados
Cada prueba se realiza con un complete de 1 millón de solicitudes. Las siguientes métricas de rendimiento se registran para cada prueba de ejecución:
- Tiempo complete para completar 1 millón de solicitudes
- Solicitudes por segundo (RPS)
- Latencia del percentil 25
- Latencia media
- Latencia mediana
- Latencia del percentil 75
- Latencia máxima
- Uso de la CPU
- Uso de memoria
Es importante tener en cuenta que el consumo de recursos, específicamente la CPU y el uso de la memoria, es tan crítico como el rendimiento en bruto. Un tiempo de ejecución más rápido que incurre en costos de recursos significativamente más altos puede no proporcionar un valor práctico en los escenarios del mundo actual.
Los resultados en el formulario de gráfico de barras se presentan a continuación:
Todos los resultados juntos en forma tabular son los siguientes:
Conclusión
En resumen, mientras que Bun y Deno demuestran un rendimiento ligeramente mejor que Node.js, la diferencia es marginal. Node.js ofrece aproximadamente 12k solicitudes por segundo (RPS), en comparación con 12.4k de Deno y Bun. Esto no representa una ganancia de rendimiento significativa, ciertamente no la mejora 2x o 3x a menudo reclamada.
Por lo tanto, es poco possible que cualquier decisión de migrar de Node.js, un líder de larga information en el ecosistema de tiempo de ejecución de JavaScript, sea impulsada por las métricas de rendimiento en bruto. En cambio, tal movimiento probablemente estaría motivado por otros factores, como el soporte de mecanografiado nativo, un modelo de permisos incorporado, una arquitectura moderna de tiempo de ejecución o características de implementación como Deno Deploy.
En esencia, el rendimiento por sí solo no justifica el abandono de Node.js; Las ventajas se encuentran en otro lugar.