Los 5 comercios con más gasto total

Gana FxDart

Requisito

Dado un mes de transacciones del libro de cuentas —cada una con fecha, comercio e importe—, encuentra los cinco comercios en los que más gastaste: agrupa por comercio, suma cada grupo, ordena los totales de mayor a menor e imprime los cinco primeros. Los datos están en el código de abajo; ambas versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
Green Grocer: $81.95
Electric Co: $60.34
Noodle Bar: $40.00
Cafe Aroma: $36.50
Book Nook: $27.99

Lado a lado

Dart nativo

FxDart

Por qué difieren

El núcleo de Dart no sabe agrupar en absoluto, así que la versión nativa tiene que recurrir a package:collection — y ahí agrupar corta la cadena: groupListsBy devuelve un Map, de modo que ordenarlo exige nombrar una variable intermedia, volver a entrar por .entries y leer cada grupo como un par sin tipo kv.key / kv.value. Ordenar añade dos rodeos más: un argumento de tipo <num> explícito (la inferencia falla porque double es Comparable<num>, no Comparable<double>) y una clave negada, ya que sortedBy solo ordena de menor a mayor.

En FxDart los cuatro pasos son cuatro eslabones de una sola cadena, de arriba abajo en el mismo orden en que el requisito los enuncia. groupedBy se queda dentro del pipeline — produce grupos (key:, items:) en lugar de un mapa, así que no hay nada que desempaquetar y volver a envolver — y sortByDesc dice «descendente» en su nombre en vez de codificarlo como un signo menos. Sin variable intermedia, sin ceremonia de argumentos de tipo y sin truco del signo: el código dice agrupa, ordena, toma cinco.

Benchmark

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

N = 100

Tiempo Empate

Dart nativo 25 µs
FxDart 138 µs

Memoria pico Empate

Dart nativo 17.0 MB
FxDart 17.1 MB

N = 10,000

Tiempo Empate

Dart nativo 712 µs
FxDart 588 µs

Memoria pico Empate

Dart nativo 22.9 MB
FxDart 23.7 MB

N = 1,000,000

Tiempo Gana FxDart

Dart nativo 116.8 ms
FxDart 63.4 ms

Memoria pico Gana FxDart

Dart nativo 137.3 MB
FxDart 117.8 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í.