Informe mensual completo del libro de cuentas

Gana FxDart

Requisito

A partir de un mes de transacciones del libro de cuentas (los datos están en el código), construye una única cadena de informe con tres secciones: el total gastado (sin contar los ingresos), un desglose por categoría ordenado por gasto y los 3 comercios principales como lista numerada. Ambas versiones deben imprimir exactamente el informe que aparece bajo Salida esperada.

Salida esperada
July 2026 ledger
Total spent: $201.99

By category:
  Bills      $88.44
  Food       $84.40
  Fun        $15.00
  Transport  $14.15

Top merchants:
  1. Electric Co  $60.34
  2. Green Grocer $43.20
  3. Water Works  $28.10

Lado a lado

Dart nativo

FxDart

Por qué difieren

En FxDart cada sección del informe tiene la misma forma: groupBysumBy por grupo → sortBy descendente —y después take y zipWithIndex convierten la sección de comercios en un top 3 numerado sin ninguna variable de índice. La versión nativa tiene que expresar cada uno de esos pasos en un dialecto distinto: fold con un valor inicial para cada suma, sortedBy<num> con una clave negada, un collection-for para una sección y un bucle for indexado para la otra. El informe crece sección a sección en ambos lados —pero solo uno de los dos crece añadiendo pasos al pipeline en vez de acumulando variables intermedias con formas distintas.

Benchmark

Apple M1 Max, 32 GB de RAM · Dart 3.12.2 (compilado AOT) · 2026-08-24

N = 100

Tiempo Empate

Dart nativo 24 µs
FxDart 30 µs

Memoria pico Empate

Dart nativo 16.5 MB
FxDart 16.6 MB

N = 10,000

Tiempo Empate

Dart nativo 934 µs
FxDart 442 µs

Memoria pico Gana FxDart

Dart nativo 23.4 MB
FxDart 17.2 MB

N = 1,000,000

Tiempo Gana FxDart

Dart nativo 135.1 ms
FxDart 47.3 ms

Memoria pico Gana FxDart

Dart nativo 157.8 MB
FxDart 127.0 MB

Las barras son medianas de iteraciones cronometradas repetidas en procesos nuevos por lado (los N pequeños se agrupan por resolución del temporizador). Dos lados a menos del 5% entre sí — o a menos de 0.6 ms, una diferencia que nadie puede percibir — cuentan como empate; las carreras relativas ajustadas se vuelven a medir hasta 5 veces. En una app, cualquier cosa por debajo de unos pocos milisegundos es invisible para el usuario, gane la barra que gane. La memoria es el RSS pico del proceso. La VM de Dart y el dataset son idénticos en ambos lados, así que la diferencia entre las dos barras es lo que retiene el pipeline en sí.