Bun.sh una nueva herramienta para nuestro maletín de utilidades Front

¿Qué es Bun?

Bun (bollo en inglés), es un entorno de tiempo de ejecución de JavaScript, como lo son Node.js, de ahora en adelante Node, o Deno, pero a diferencia de esto últimos, tiene un paquete nativo, un transpilador, un ejecutor de tareas y un cliente npm integrado.

Otra de las grandes diferencias, es que utiliza el motor de JavaScript (JavaScriptCore) incorporado para WebKit, más rápido que V8. Bun se denomina a sí mismo como una herramienta rápida todo-en-uno.

Bun, es una herramienta de código abierto, creada por Jared Summer y más de 40 colaboradores hace relativamente poco, siendo la primera versión publicada en abril de 2021, estando todavía en una versión Beta.

¿Por qué Bun?

Hoy en día, el rey de los entornos de ejecución de JavaScript, es Node, tiene alrededor de 12 años, fue desarrollado por Ryan Dahl en 2009 como un entorno de lado del servidor basado en el motor de JavaScript V8 de Google.

Node, se encuentra en un punto de madurez que lo han convertido en una herramienta básica para nuevos estándares de programación, (MEAN, MERN, MEVN), además consiguió brindar soluciones del lado del servidor, haciendo posible desarrollar aplicaciones web en un solo lenguaje, JavaScript, tanto para backend como para frontend, siendo ampliamente utilizado por las principales empresas tecnológicas, Netflix, Paypal, NASA…

Deno, fue lanzado en 2020, por el mismo creador de Node, Ryan Dahl, para solucionar problemas de diseño y/o limitaciones de Node. Deno es un entorno de ejecución moderno y seguro, para JavaScript, TypeScript y WebAssembly que utiliza V8 y está desarrollado en Rust, una de las principales ventaja con respecto a Node es que Deno es seguro por defecto, una de las principales desventajas hasta hace muy poco, es que Deno no era compatible con la gestión de paquetes NPM, de ahí que su adopción haya sido lenta, aunque ha llegado a encontrar su propio espacio como competidor de Node.

Y llegó Bun

En abril de 2021, Jared Summer presentó la primera versión de Bun, y según su creador fue ideado para:

  • Arrancar rápido.
  • Disponer de nuevos niveles de rendimiento (ampliando JavaScriptCore, el motor).
  • Convertirse en una gran y completa herramienta (empaquetador, transpilador, administrador de paquetes).

Node y Deno utilizan el motor V8 y lo han convertido en grandes herramientas debido a la compilación JIT (Just In Time). Ahora Bun usa JavaScript Core, que se considera más rápido. También está escrito en un lenguaje de bajo nivel, Zig. El bajo nivel de control de la memoria y la falta de flujo de control oculto son las características de Zig que hacen que Bun sea tan rápido como es, eso y que ha sido creado desde cero, intentando mejorar las herramientas ya existentes.

Bun, ha sido diseñado como un reemplazo directo para sus aplicaciones o scripts actuales de JavaScript y TypeScript, porque implementa de forma nativa alrededor de 90% de las funciones nativa de Node (funciones Node-API), entre otras características que lo hacen muy interesante.

Características:

  • Implementa API web como fetch, WebSocket y ReadableStream
  • Implementa el algoritmo de resolución node_modules de Node, por lo que puede usar paquetes npm en Bun. Se admiten tanto ESM como CommonJS; internamente, Bun usa ESM.
  • Transpila todos los archivos, por lo que TypeScript y JSX simplemente funcionan.
  • Admite "rutas", "jsxImportSource" y más desde archivos tsconfig.json.
  • Expone Bun.Transpiler, el transpilador JSX y TypeScript de Bun, como una API.
  • Utiliza las llamadas al sistema más rápidas disponibles con Bun.write para escribir, copiar, canalizar, enviar y clonar archivos.
  • Carga variables de entorno desde archivos .env automáticamente, no más require("dotenv").config().
  • Dispone de cliente nativo y rápido de SQLite3 bun:sqlite.
  • Implementa la mayor parte de Node-API, por lo que muchos módulos nativos de Node simplemente funcionan.
  • Proporciona una interfaz de funciones foráneas de baja sobrecarga bun:ffi para llamar a código nativo desde JavaScript.
  • Admite una lista creciente de módulos principales de Node como node:fs y node:path, junto con globales como Buffer y process.

¿Porque necesitamos otro entorno de ejecución en JavaScript si ya tenemos Node y Deno?

Solo el tiempo dirá qué entorno de ejecución sobrevive a la batalla. Tiene que haber una razón de peso para elegir Bun en lugar de Node. Al igual que se requiere una razón para elegir Deno sobre Node. Debería haber una razón muy poderosa para deshacerse de un entorno de ejecución confiable y probado en batalla como Node. En el caso de Bun, la razón de peso será la velocidad.

Bun afirma que es muchas veces más rápido que Node y Deno. Una aplicación simple como hola mundo se ejecuta muchas veces más rápido con Bun. Lo mismo se extiende a la instalación de npm, la ejecución de pruebas, etc. ¡Bun tiene que ver con la velocidad! Esta será la razón principal para Bun. ¡Ejecutar exactamente la misma aplicación, pero logrando un mayor rendimiento!

Pruebas de rendimiento Bun vs. Node

Las pruebas de rendimiento han sido ejecutadas en entorno local y el hardware utilizado ha sido:

Mac OS M1 con 16Gb de RAM

Bun v0.2.0, actualmente está disponible la versión v0.5.0

Node v18.11.0

Código

El código de hello world en ambos casos utiliza solamente API nativas.

Bun
Código bun de prueba
Figure 1: Código bun de prueba
Node
Código Node de prueba
Figure 2: Código Node de prueba

Mediciones

No se trata solo de cuán rápido es un entorno de ejecución. Un entorno de ejecución puede ser muy rápido, pero puede detener el sistema al usar demasiada CPU, memoria, disco, etc. Las medidas utilizadas por el sitio oficial de Bun son principalmente solicitudes por segundo. Esto no representa la imagen completa. Además, necesitamos ver la distribución del tiempo de respuesta en diferentes cuantiles.

Aquí está la lista completa de medidas:

  • Tiempo mínimo de respuesta
  • Tiempo de respuesta del 10º percentil
  • Tiempo de respuesta del primer cuartil
  • Mediana de tiempo de respuesta
  • Promedio de respuesta
  • Tiempo de respuesta del tercer cuartil
  • Tiempo de respuesta del 90º percentil
  • Tiempo máximo de respuesta
  • Uso de CPU
  • Uso de memoria

Concurrencia

La otra cosa importante es la concurrencia. La cantidad de conexiones simultáneas tiene un impacto significativo sobre el tiempo de respuesta y eso tiene un impacto sobre las solicitudes por segundo.

Además, una prueba de carga para solicitudes de 1K, 10K o 50K es demasiado pequeña para juzgar un tiempo de ejecución de manera justa. La prueba debe llevarse a cabo a través de numerosas solicitudes. Todas las pruebas realizadas para este artículo se ejecutan en 10 millones de solicitudes para cada nivel de concurrencia.

Se ejecuta un total de 10 millones de solicitudes para las siguientes conexiones simultáneas:

50 conexiones simultáneas (baja concurrencia)

100 conexiones simultáneas (concurrencia media)

200 conexiones simultáneas (alta concurrencia)

Resultados

Esta sección contiene los resultados de las pruebas de carga realizadas para averiguar cómo se desempeña Bun en comparación con Node para un caso de uso simple de hola mundo. Los resultados son lo suficientemente detallados para comprender todos los aspectos, no solo las solicitudes por segundo.

50 conexiones simultáneas

Veamos cómo se desempeña Bun frente a Node para una concurrencia baja de 50 conexiones. Aquí están los resultados:

Figure 3: Resultados concurrencia 50 conexiones simultáneas
Figure 4: Tabla de resultados 50 conexiones concurrentes
Figure 5: Comparativa consumo de CPU 50 conexiones concurrentes
Figure 6: Comparativa consumo de Memoria 50 conexiones concurrentes

Análisis

Bun es seguramente más rápido que Node para un caso de uso simple de "hola mundo". Sin embargo, Bun no resultó ser dos o tres veces más rápido. Los resultados muestran que Bun es entre un 40% y un 50% más rápido, lo que también es bastante bueno. En el lado positivo, Bun procesa más RPS que Node, usa aproximadamente la mitad de la CPU. En el lado negativo, Bun usa el doble de memoria.

Digital Lover

100 conexiones simultáneas

Veamos cómo se desempeña Bun frente a Node para una simultaneidad media a alta de 100 conexiones. Aquí están los gráficos:

Figure 7: 3 Resultados concurrencia 100 conexiones simultáneas
Figure 8: Tabla de resultados 100 conexiones concurrentes
Figure 9: Comparativa consumo de CPU 100 conexiones concurrentes
Figure 10: Comparativa consumo de Memoria 100 conexiones concurrentes

Análisis

Los resultados son los mismos que antes. Bun es rápido, pero pierde el margen ganador a medida que la concurrencia alcanza un nivel alto (100 conexiones simultáneas). El uso de memoria de Bun sigue siendo el doble que el de Node, mientras que el uso de CPU sigue siendo la mitad del de Node.

200 conexiones simultáneas

Veamos cómo se desempeña Bun frente a Node para una concurrencia muy alta de 200 conexiones. Aquí están los gráficos:

Figure 11: 3 Resultados concurrencia 200 conexiones simultáneas
Figure 12: Tabla de resultados 200 conexiones concurrentes
Figure 13: Comparativa consumo de CPU 200 conexiones concurrentes
Figure 14: Comparativa consumo de Memoria 200 conexiones concurrentes

Análisis

Nada nuevo en alta concurrencia también. El mismo patrón continúa, con Node acercándose mucho a Bun con una concurrencia muy alta (200 conexiones paralelas).

Conclusiones

Si nos guiamos por las pruebas de rendimiento, Bun supera constantemente a Node, pero sin tanta diferencia como presuponíamos, consume menos CPU, pero deberá de mejorar en la gestión de la memoria si quiere ser un competidor serio de Node, ya que consume el doble, la buena noticia es que tiene margen de mejora, además se presenta como una solución todo-en-uno, lo que facilitaría al ecosistema de desarrollo.

Bun tiene cosas interesantes, paquete nativo que reemplaza web pack, transpilador que permite escribir TypeScript de forma inmediata, ejecutor de tareas, cliente npm, que lo hace compatible con los millones de paquetes que se utilizan en Node, ejecutor de pruebas nativo…

Si en un futuro mejora la gestión de memoria y demuestra su confiabilidad puede desafiar la corona de Node, pero de momento Node sigue siendo el rey, aunque tendrá que innovar si quiere mantener la corona, y Bun un aspirante a tener (muy) en cuenta.

Fuentes:

 

 

Tags

He leído y acepto la política de privacidad
Acepto recibir emails sobre actividades de recruiting NTT DATA