Saldo acumulado de una cuenta

Gana FxDart

Requisito

Una cuenta abre julio con un saldo de $250.00 y registra seis transacciones con signo: la nómina que entra, el alquiler y la compra que salen. Imprime una línea en formato de moneda por cada paso: primero el saldo de apertura y después el saldo tras cada transacción. Los datos están en el código de abajo; ambas versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
Opening balance $250.00
Salary          $2850.00
Rent            $1700.00
Green Grocer    $1656.80
Refund          $1685.30
Electric Co     $1624.96
Cafe Aroma      $1615.16

Lado a lado

Dart nativo

FxDart

Por qué difieren

El núcleo de Dart tiene fold, que colapsa la lista hasta el saldo final, pero esta tarea necesita todos los intermedios, y no hay scan. Así que la versión nativa recurre a una variable mutable balance hilada a través de un bucle, y el formateo queda entremezclado con la acumulación. El scan de FxDart emite cada estado acumulado como un valor (primero el valor inicial, lo que regala la línea del saldo de apertura) y map formatea después, como un paso aparte e intercambiable. El estado acumulado como etapa de un pipeline en lugar de como una mutación es justo el vocabulario que le falta aquí a Dart.

Benchmark

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

N = 100

Tiempo Empate

Dart nativo 24 µs
FxDart 22 µs

Memoria pico Empate

Dart nativo 16.5 MB
FxDart 16.5 MB

N = 10,000

Tiempo Empate

Dart nativo 2.07 ms
FxDart 2.11 ms

Memoria pico Empate

Dart nativo 24.0 MB
FxDart 23.6 MB

N = 1,000,000

Tiempo Gana nativo

Dart nativo 237.8 ms
FxDart 275.1 ms

Memoria pico Empate

Dart nativo 182.9 MB
FxDart 185.2 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í.