Reembolsos frente a cargos, ambos formateados

Gana FxDart

Requisito

Un libro de cuentas mezcla cargos y reembolsos (importes negativos). Divídelo en los dos grupos, formatea cada transacción como merchant $amount e imprime una línea por grupo, primero los reembolsos. Los datos están en el código de abajo; ambas versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
refunds: Web Store $89.99, Airline $120.00, Book Nook $27.99
charges: Cafe Aroma $12.50, Web Store $89.99, Noodle Bar $18.90, Airline $240.00, Green Grocer $43.20

Lado a lado

Dart nativo

FxDart

Por qué difieren

Dart no tiene partition: cuando necesitas ambas mitades, where solo te da una, así que la versión nativa filtra dos veces —una con el predicado y otra con su negación, escrita a mano (< 0 y >= 0)—. Eso son dos pasadas sobre los datos y dos predicados que mantener sincronizados: si algún día cambia la regla de los reembolsos, nada obliga a la segunda línea a seguirla. El partition de FxDart convierte la división en una sola declaración: un único predicado, una única pasada y una desestructuración de record que pone nombre a ambas mitades. El formateo posterior con map + join es igual en ambas.

Benchmark

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

N = 100

Tiempo Empate

Dart nativo 28 µs
FxDart 21 µs

Memoria pico Empate

Dart nativo 16.5 MB
FxDart 16.5 MB

N = 10,000

Tiempo Empate

Dart nativo 2.20 ms
FxDart 1.93 ms

Memoria pico Empate

Dart nativo 23.4 MB
FxDart 22.9 MB

N = 1,000,000

Tiempo Gana FxDart

Dart nativo 253.3 ms
FxDart 235.9 ms

Memoria pico Empate

Dart nativo 176.1 MB
FxDart 178.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í.