Sube en lotes de 4

Empate

Requisito

Hay diez archivos en cola para subir y la API acepta como mucho cuatro por petición. Agrupa la cola en lotes de 4 (el último queda corto) e imprime el tamaño y los ids de cada lote. Los datos están en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
batch of 4: img-01 img-02 img-03 img-04
batch of 4: img-05 img-06 img-07 img-08
batch of 2: img-09 img-10

Lado a lado

RxDart

FxDart

Por qué difieren

El loteo sin solapamiento es vocabulario básico en ambos modelos, y ambos lo dicen en una palabra: bufferCount(4) junta cuatro eventos antes de emitir una List, chunk(4) tira de cuatro valores a una List por demanda. Ambos vuelcan el lote final corto cuando la fuente se agota. El map que formatea cada lote es, a partir de ahí, idéntico carácter por carácter.

Donde los modelos empezarían a divergir queda justo fuera del marco de este ejemplo. Un stream almacena porque los valores llegan según su propio calendario — bufferCount tiene además hermanos basados en tiempo (bufferTime) que un pipeline pull deliberadamente no ofrece, porque «lo que llegó en el último segundo» no significa nada cuando el consumidor controla la llegada. Una cadena pull trocea porque el consumidor quiere demanda de cuatro en cuatro — que es también la razón de que chunk componga directamente con la concurrencia aguas abajo (enviar cada lote mientras se arma el siguiente). Para una cola fija de diez, ninguna de las dos ventajas se ejercita: empate.

Benchmark

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

N = 100

Tiempo Empate

RxDart 34 µs
FxDart 8.9 µs

Memoria pico Empate

RxDart 16.5 MB
FxDart 16.5 MB

N = 1,000,000

Tiempo Gana FxDart

RxDart 287.8 ms
FxDart 98.1 ms

Memoria pico Empate

RxDart 128.5 MB
FxDart 132.1 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í.