Aplana los pedidos en líneas
Requisito
Los cuatro pedidos de ayer contienen dos o tres líneas cada uno.
Aplánalos en una sola lista de líneas order/sku — cada
artículo bajo el id de su pedido, en orden de origen — e imprime el
recuento de líneas. Los datos están en el código; las dos versiones
deben imprimir las líneas que aparecen bajo Salida esperada.
Salida esperada
A-101/tea-01 A-101/mug-07 A-102/pen-11 A-102/ink-02 A-102/pad-05 A-103/mug-07 A-103/lid-04 A-104/tea-01 A-104/jar-03 A-104/lid-04 10 lines from 4 orders
Lado a lado
RxDart
FxDart
Por qué difieren
El aplanado uno-a-muchos es roca madre en ambos modelos, y para una
carga síncrona las dos formas son la misma palabra:
Stream.expand y el flatMap de FxDart toman
ambos elemento a iterable, empalman las piezas en orden de
origen y entregan el resultado a un map de formateo. Los
paneles son paralelos línea a línea.
La divergencia interesante queda justo fuera del escenario. Cuando las
líneas de cada pedido llegaran de forma asíncrona, el lado Rx
pasaría al flatMapIterable o al flatMap de
RxDart — streams internos, donde el orden de mezcla se vuelve
una pregunta real (intercalado por terminación salvo que concatenes).
El flatMap asíncrono de FxDart, sobre un pipeline del que
se tira, se mantiene en orden de origen por construcción. Pero esa es
una historia del tier 4; en este trabajo en memoria ambos lados
expresan el aplanado directamente — el panel Rx ni siquiera necesita
un operador de RxDart, el Stream del core lo lleva — y el
único rastro es el main asíncrono. Empate.
Benchmark
N = 100
Tiempo Empate
Memoria pico Gana RxDart
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í.