Cada llamada alimenta la siguiente
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
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
Memoria pico Empate
N = 10,000
Tiempo Empate
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í.