Saldo acumulado de un feed de depósitos

Empate

Requisito

Una cuenta abre a cero y recibe siete movimientos — depósitos en positivo, retiradas en negativo. Imprime el saldo tras cada movimiento, una línea por paso. Los datos están en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
Balance: 250
Balance: 170
Balance: 290
Balance: 250
Balance: 750
Balance: 430
Balance: 520

Lado a lado

RxDart

FxDart

Por qué difieren

Apenas difieren. El estado acumulado es un fold con sus pasos intermedios expuestos, y ambas bibliotecas llaman a ese fold scan — RxDart como transformador de stream, FxDart como operador perezoso portado del mismo linaje Rx. Una acumulación por movimiento, en orden, en ambos lados.

Las diferencias visibles son detalles de cadencia, no de modelo. El scan de RxDart toma una semilla y emite un valor por evento (su acumulador recibe además un índice); el scan con semilla de FxDart sigue a FxTS y produce primero la semilla misma, así que el panel usa el scan1 sin semilla — para un saldo que abre a cero, cada suma parcial es el saldo, y las dos cadencias encajan exactamente. Más allá de eso, el único residuo es la entrega: la versión stream recolecta a través de un main async, la versión pull es una sola cadena síncrona. Un empate justo — ambos lados dicen el requisito con un único operador.

Benchmark

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

N = 100

Tiempo Empate

RxDart 9.7 µs
FxDart 763 ns

Memoria pico Empate

RxDart 16.5 MB
FxDart 16.4 MB

N = 1,000,000

Tiempo Gana FxDart

RxDart 69.9 ms
FxDart 7.12 ms

Memoria pico Gana RxDart

RxDart 56.0 MB
FxDart 59.9 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í.