De líneas de pedido a resumen de factura

Gana FxDart

Requisito

Cada línea de un pedido tiene un producto, una categoría, una cantidad y un precio unitario. Imprime el resumen de la factura: una línea por categoría con su total (cantidad × precio unitario, sumado), la categoría mayor primero, y después un total general. 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
Invoice by category:
Electronics: $124.87
Office: $75.80
Pantry: $29.50
Total: $230.17

Lado a lado

Dart nativo

FxDart

Por qué difieren

El mismo importe, qty * unitPrice, se suma dos veces —por categoría y en total— y las dos versiones tratan eso de forma distinta. Dart nativo lo deletrea con dos modismos que no se parecen en nada: un bucle for que muta un map para las categorías y luego un fold con un valor inicial explícito para el total general. FxDart dice «suma de un campo» igual las dos veces —sumBy— una por cada grupo de groupBy y otra sobre todos los elementos, con sortBy ordenando las filas. Cuando la factura gane una regla de descuento, un único vocabulario cambia en un solo sitio por pipeline; la versión nativa cambia el cuerpo de un bucle y un fold.

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 8.2 µs

Memoria pico Empate

Dart nativo 16.5 MB
FxDart 16.5 MB

N = 10,000

Tiempo Empate

Dart nativo 243 µs
FxDart 111 µs

Memoria pico Gana FxDart

Dart nativo 22.4 MB
FxDart 15.8 MB

N = 1,000,000

Tiempo Gana FxDart

Dart nativo 25.3 ms
FxDart 13.6 ms

Memoria pico Empate

Dart nativo 92.3 MB
FxDart 88.4 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í.