Aplana los pedidos en líneas

Empate

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

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

N = 100

Tiempo Empate

RxDart 421 µs
FxDart 26 µs

Memoria pico Gana RxDart

RxDart 15.5 MB
FxDart 16.5 MB

N = 1,000,000

Tiempo Gana FxDart

RxDart 3645.4 ms
FxDart 400.1 ms

Memoria pico Empate

RxDart 484.3 MB
FxDart 493.7 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í.