Reintentar el fetch inestable

Empate async

Requisito

El endpoint del manifiesto corta la conexión exactamente dos veces antes de servir su payload. Reintenta hasta que tenga éxito, con un presupuesto de tres intentos en total, y luego imprime el payload y cuántos intentos hicieron falta. La inyección del fallo es determinista y está en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
manifest 2026-08 (12 entries)
attempts: 3

Lado a lado

RxDart

FxDart

Por qué difieren

Apenas nada — esto es una sola llamada en cada lado, y ese es el sentido del par. La diferencia está en qué significa «volver a intentarlo» en cada modelo. En RxDart un stream que ha errado está muerto, así que Rx.retry toma una fábrica y la re-suscribe: reintentar es volver a escuchar, y el argumento de conteo es el número de reintentos después del primer intento (aquí 2, para tres intentos). En FxDart la cosa inestable es una función que devuelve un Future, así que retry simplemente la llama otra vez — attempts es el presupuesto total (3), y el último error se relanza con su stack trace original cuando el presupuesto se agota.

Un empate genuino. Las formas solo divergen cuando la cosa reintentada crece: si se convierte en un pipeline de varios valores, RxDart mantiene el mismo idioma de fábrica, mientras que FxDart envuelve el terminal (retry(3, () => fxAsync(…).toList())) o pasa a reintentos por elemento — un par con entidad propia, dos ejemplos más adelante.

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 586 µs
FxDart 504 µs

Memoria pico Empate

RxDart 16.5 MB
FxDart 16.3 MB

N = 10,000

Tiempo Gana FxDart

RxDart 49.8 ms
FxDart 43.0 ms

Memoria pico Empate

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