Sube en lotes de 4
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
N = 100
Tiempo Empate
Memoria pico Empate
N = 1,000,000
Tiempo Gana FxDart
Memoria pico Empate
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í.