Nivel de stock tras cada movimiento

Empate

Requisito

El libro de almacén de un SKU lista movimientos con signo — recepciones en positivo, envíos en negativo — partiendo de un stock inicial de 20. Imprime el nivel inicial y luego cada movimiento con el nivel resultante, marcando cualquier nivel negativo como backorder. Los movimientos están en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
start: 20
+40: 60
-25: 35
-50: -15 (backorder)
+30: 15
-20: -5 (backorder)
-10: -15 (backorder)
+45: 30

Lado a lado

RxDart

FxDart

Por qué difieren

El estado acumulado es scan en ambos dialectos — el de FxDart es el port de FxTS de la misma idea Rx, así que el fold en sí es idéntico: un record acumulador que lleva la etiqueta del movimiento y el nivel posterior. La única costura visible es la semilla. El scan de FxDart emite la semilla como su primer valor, así que la línea inicial start: 20 cae de la cadena gratis. El scan de RxDart empieza a emitir en el primer pliegue, así que el nivel inicial hay que reproducirlo con startWith — un operador extra, no una penuria.

Pasada la semilla, los dos pipelines son las mismas tres palabras, y el map que marca se lee igual de bien en cualquiera de los dos lados — la versión pull simplemente se mantiene síncrona porque el libro ya está en memoria, mientras que la versión stream espera su propia entrega. El estado acumulado sobre una secuencia ordenada es terreno propio de ambos modelos: empate, con la diferencia de emisión de la semilla como la única curiosidad que conviene recordar al portar entre ellos.

Benchmark

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

N = 100

Tiempo Empate

RxDart 335 µs
FxDart 12 µs

Memoria pico Gana RxDart

RxDart 15.1 MB
FxDart 16.5 MB

N = 1,000,000

Tiempo Gana FxDart

RxDart 3288.1 ms
FxDart 162.5 ms

Memoria pico Empate

RxDart 126.5 MB
FxDart 126.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í.