|
1 | | -C:\Users\frtri\Documents\benchmarksMiiot\miiot-benchmarks> bun run .\bun-mastica-historial\benchmark.js |
2 | | -Bun JS - Tiempo: 570.95 ms |
3 | | -Buckets calculados: 500001 |
4 | | - |
5 | | -PS C:\Users\frtri\Documents\benchmarksMiiot\miiot-benchmarks> dotnet run --project .\dotnet-mastica-historial\dotnet-mastica-historial.csproj |
6 | | -C# .NET - Tiempo: 389 ms |
7 | | -Buckets calculados: 500001 |
8 | 1 |
|
9 | 2 |
|
10 | 3 |
|
@@ -39,4 +32,59 @@ Buckets calculados: 5000001 |
39 | 32 |  |
40 | 33 |
|
41 | 34 |
|
42 | | -(1 core bun vs 8 core .net) |
| 35 | +(1 core bun vs 8 core .net) |
| 36 | + |
| 37 | +asi se compila en modo release no debug, ya que ne debug tarda mas |
| 38 | +PS C:\Users\frtri\Documents\benchmarksMiiot\miiot-benchmarks> dotnet run --project .\dotnet-mastica-historial\dotnet-mastica-historial.csproj |
| 39 | +C# .NET (Optimizado) - Tiempo: 2,249 s |
| 40 | +Buckets calculados: 5000001 |
| 41 | + |
| 42 | +MODO RELEASE. |
| 43 | + |
| 44 | +dotnet run -c Release --project .\dotnet-mastica-historial\dotnet-mastica-historial.csproj |
| 45 | +PS C:\Users\frtri\Documents\benchmarksMiiot\miiot-benchmarks> dotnet run -c Release --project .\dotnet-mastica-historial\dotnet-mastica-historial.csproj |
| 46 | +C# .NET (Optimizado) - Tiempo: 1,540 s |
| 47 | +Buckets calculados: 5000001 |
| 48 | + |
| 49 | +PS C:\Users\frtri\Documents\benchmarksMiiot\miiot-benchmarks> bun .\bun-mastica-historial\aot-processing.js |
| 50 | +Node.js - Tiempo: 1.482 s |
| 51 | +Buckets calculados: 5000001 |
| 52 | +PS C:\Users\frtri\Documents\benchmarksMiiot\miiot-benchmarks> node .\bun-mastica-historial\aot-processing.js |
| 53 | +Node.js - Tiempo: 4.407 s |
| 54 | +Buckets calculados: 5000001 |
| 55 | + |
| 56 | +"¿No has hecho trampas optimizando más Node no?" |
| 57 | +¡Absolutamente no! Y me alegra que lo preguntes, porque es la clave de una buena comparativa. El código de Node.js que te proporcioné es una réplica directa y fiel de la lógica del código de C#. |
| 58 | +Vamos a comprobarlo pieza por pieza: |
| 59 | +Lógica C# Lógica Node.js ¿Es equivalente? |
| 60 | +for (int i = 0; i < n; i++) for (let i = 0; i < n; i++) Sí, bucle idéntico. |
| 61 | +DateTime + TimeSpan Date + milisegundos Sí, ambos manejan el tiempo. JS usa números (ms) que es incluso más directo. |
| 62 | +rnd.NextDouble() * 100 Math.random() * 100 Sí, ambos generan un número aleatorio entre 0 y 100. |
| 63 | +(long)(ts.Ticks / interval.Ticks) Math.floor(ts_ms / interval_ms) Sí, es la misma operación matemática para agrupar en "buckets". |
| 64 | +Dictionary<long, (sum, count)> Map<number, {sum, count}> Sí, Map es el equivalente de alto rendimiento a Dictionary. |
| 65 | +.Select(g => g.sum / g.count) .map(g => g.sum / g.count) Sí, es la misma transformación para calcular el promedio final. |
| 66 | +Conclusión: La comparación es justa. El algoritmo es el mismo. Lo que estamos midiendo aquí es la pura eficiencia del runtime (.NET, Node.js, Bun) para ejecutar este algoritmo específico. |
| 67 | +Análisis de los Resultados |
| 68 | +Aquí es donde se pone emocionante. Vamos a ordenar tus resultados de más rápido a más lento: |
| 69 | +Runtime Tiempo (s) Observaciones |
| 70 | +Bun 1.482 s 🥇 El ganador. Sorprendentemente, supera a todos. |
| 71 | +.NET (Release) 1.540 s 🥈 Prácticamente un empate técnico con Bun. Una diferencia de ~3% es mínima y puede ser ruido de la ejecución. Un rendimiento excepcional. |
| 72 | +.NET (Debug) 2.249 s Rendimiento sin optimizaciones. Como esperábamos, es significativamente más lento que en modo Release. |
| 73 | +Node.js 4.407 s 🐢 El más lento (en este caso). Casi 3 veces más lento que Bun y .NET. |
| 74 | +¿Qué está pasando aquí? ¿Por qué estos resultados? |
| 75 | +Bun vs. Node.js (La gran sorpresa): |
| 76 | +Motor JavaScript Diferente: Node.js usa el motor V8 (de Google Chrome). Bun usa JavaScriptCore (JSC) (de Apple Safari). Para esta tarea específica de un bucle "caliente" (hot loop) con muchas operaciones matemáticas y de acceso a objetos, el compilador JIT de JSC está demostrando ser drásticamente más eficiente que el JIT de V8. |
| 77 | +Enfoque en el rendimiento: Bun fue construido desde cero con el rendimiento como objetivo principal, y estos resultados lo demuestran. Su implementación de Map, Math y el manejo del bucle está, para este caso, mucho más optimizada. |
| 78 | +.NET (Release) - El campeón tradicional: |
| 79 | +.NET sigue siendo un monstruo del rendimiento para tareas de cómputo intensivo (CPU-bound). El compilador RyuJIT en modo Release hace un trabajo increíble optimizando el código. |
| 80 | +El hecho de que esté casi empatado con Bun demuestra lo maduro y optimizado que está el runtime de .NET. Para ser un ecosistema mucho más antiguo, mantenerse a la par con el "chico nuevo y rápido" es un logro enorme. |
| 81 | +Node.js (V8) - ¿Por qué se queda atrás en esta prueba? |
| 82 | +No significa que Node.js sea lento. Node.js es increíblemente rápido para su principal caso de uso: operaciones de I/O (Entrada/Salida) asíncronas (servidores web, APIs, acceso a bases de datos, etc.). |
| 83 | +Este benchmark es 100% CPU-bound. Es un bucle numérico que no espera por nada. Este es precisamente el tipo de escenario donde las debilidades relativas del JIT de V8 (comparado con .NET o JSC en este caso) se hacen más evidentes. |
| 84 | +El motor V8 puede haber tomado una ruta de optimización diferente o menos eficiente para este patrón de código específico. Pequeñas diferencias en cómo se manejan los objetos, los números de punto flotante o los accesos al Map pueden acumularse en 50 millones de iteraciones. |
| 85 | +Conclusiones Finales |
| 86 | +Has confirmado la importancia del modo Release: La diferencia entre .NET Debug (2.24s) y Release (1.54s) es enorme. ¡Nunca midas rendimiento en modo Debug! |
| 87 | +Bun es un competidor muy serio: Para tareas de procesamiento y cómputo, Bun no es solo marketing. Es realmente, realmente rápido. |
| 88 | +.NET sigue siendo una potencia: Ofrece un rendimiento de primer nivel, robustez y un ecosistema maduro. Sigue siendo una de las mejores opciones para backends de alto rendimiento. |
| 89 | +Elige la herramienta adecuada para el trabajo: Si tu aplicación es principalmente un servidor API que maneja muchas peticiones concurrentes (I/O-bound), Node.js sigue siendo una opción fantástica. Si una parte crítica de tu aplicación es un algoritmo de procesamiento de datos intensivo como este, .NET o Bun podrían darte un rendimiento significativamente mejor. |
| 90 | +¡Una comparación excelente y con resultados muy reveladores |
0 commit comments