Ranking del mes por categoría

Gana FxDart

Requisito

Dadas transacciones del libro de cuentas con algunos rezagados de junio mezclados, quédate solo con julio de 2026 y calcula las tres categorías con más gasto total — la más grande primero —, imprimiendo cada categoría con su total y cuántas compras abarca. Los datos están en el código de abajo; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
Bills: $108.46 (2 purchases)
Food: $84.40 (4 purchases)
Fun: $37.00 (2 purchases)

Lado a lado

Dart nativo

FxDart

Por qué difieren

La tarea es un solo pensamiento — quedarse con el mes, agrupar, totalizar, rankear, top tres — y la versión FxDart es una sola cadena: filter conserva julio, groupedBy produce registros (key:, items:), así que el total por categoría está a un paso de map, y sortByDesc dice «el más grande primero» por clave. Dart nativo reparte el mismo pensamiento a través de un Map: groupListsBy (de package:collection) termina la cadena fluida, y el orden descendente se convierte en el volteo de operandos del comparador (a, b) => b…compareTo(a…) — un criadero clásico de bugs silenciosos, y la razón por la que el lado FxDart nunca niega una clave.

Honestamente: package:collection cubre bien el agrupamiento, y para un informe puntual la versión nativa está bien. La cadena se gana el sueldo conforme el informe crece — cada paso añadido (un filtro, un segundo criterio de ranking) extiende el pipeline en vez de otro viaje de ida y vuelta por entries.

Benchmark

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

N = 100

Tiempo Empate

Dart nativo 4.5 µs
FxDart 13 µs

Memoria pico Empate

Dart nativo 16.5 MB
FxDart 16.6 MB

N = 10,000

Tiempo Empate

Dart nativo 348 µs
FxDart 299 µs

Memoria pico Empate

Dart nativo 17.5 MB
FxDart 17.5 MB

N = 1,000,000

Tiempo Empate

Dart nativo 33.2 ms
FxDart 32.1 ms

Memoria pico Empate

Dart nativo 146.9 MB
FxDart 148.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í.