Cada llamada alimenta la siguiente

Empate async

Requisito

Cuatro pasos de API corren estrictamente uno tras otro — login, perfil, pedidos, factura — y cada petición se construye a partir de la respuesta anterior (el id de sesión alimenta la llamada de perfil, el id de usuario alimenta la llamada de pedidos, …). Imprime cada paso con su respuesta. La tabla de la API falsa está en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
login -> session-9
profile -> user-42
orders -> order-7
invoice -> pdf-3

Lado a lado

RxDart

FxDart

Por qué difieren

Ningún modelo tiene que pelear aquí por la secuencialidad. El asyncMap de RxDart pausa la fuente mientras corre cada future, así que las llamadas son seriales por construcción; un pipeline pull solo pide el siguiente valor después de que el anterior se resolviera, así que es serial por defecto. La diferencia interesante es dónde vive la dependencia — el token que cada respuesta entrega a la petición siguiente.

El lado RxDart lo enhebra por una variable mutable sobre la que el mapper se cierra: idiomático, compacto, y ligeramente fuera del pipeline — el flujo de datos entre pasos es invisible para la cadena de operadores. El lado FxDart lo enhebra por el acumulador de scan, de modo que la respuesta anterior es una entrada explícita del paso siguiente; el coste es que scan emite su semilla, que la impresión tiene que saltarse. Una variable oculta frente a una línea de semilla saltada — un empate genuino, decidido por si prefieres el estado capturado en un closure o el estado visible en el pliegue.

Benchmark

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

Caso async: la escala principal es N = 10,000, no 1,000,000. Cada elemento cuesta una vuelta del event loop en ambos lados, así que un millón de awaits reales mediría el event loop de Dart durante minutos — no el pipeline. Los retardos son de longitud cero y se conserva el límite de concurrencia del ejemplo; lo que comparan las barras es la maquinaria del pipeline.

N = 100

Tiempo Empate

RxDart 432 µs
FxDart 415 µs

Memoria pico Empate

RxDart 16.5 MB
FxDart 16.5 MB

N = 10,000

Tiempo Empate

RxDart 35.9 ms
FxDart 36.1 ms

Memoria pico Empate

RxDart 28.2 MB
FxDart 28.6 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í.