Categorías que superan su presupuesto mensual
Requisito
Cada categoría de gasto tiene un presupuesto mensual. A partir de las transacciones de julio, suma el total de cada categoría, quédate solo con las categorías que se pasaron de su presupuesto e imprímelas empezando por la peor —con el gasto, el presupuesto y el exceso en cada línea. Los datos están en el código de abajo; ambas versiones deben imprimir las líneas que aparecen bajo Salida esperada.
Salida esperada
Over budget in July: Food: $135.75 spent, $120.00 budget (over by $15.75) Fun: $34.75 spent, $30.00 budget (over by $4.75) Bills: $90.33 spent, $90.00 budget (over by $0.33)
Lado a lado
Dart nativo
FxDart
Por qué difieren
La línea de formato es idéntica en ambas versiones —la diferencia está
en todo lo que viene antes. Dart nativo hace la agrupación a mano en un
mapa mutable y luego cambia de modismo dos veces: un bucle
for para sumar, un where para filtrar, un
sort en cascada con un comparador hecho a mano para
ordenar. La versión de FxDart es un solo vocabulario de principio a fin:
groupBy, map a los totales,
filter contra el presupuesto, sortBy por el
exceso, join. Cada regla de negocio —pasarse del
presupuesto, la peor primero— es un paso con nombre que puedes señalar
en una revisión de código.
Benchmark
N = 100
Tiempo Empate
Memoria pico Empate
N = 10,000
Tiempo Empate
Memoria pico Gana FxDart
N = 1,000,000
Tiempo Gana FxDart
Memoria pico Gana FxDart
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í.