La petición más rápida y la más lenta

Empate async

Requisito

Un health check sondea ocho endpoints a través de una llamada asíncrona measure e informa de la latencia más rápida y la más lenta en milisegundos. Las muestras fijas están en el código; las dos versiones deben imprimir las dos líneas que aparecen bajo Salida esperada.

Salida esperada
fastest: 12 ms
slowest: 210 ms

Lado a lado

RxDart

FxDart

Por qué difieren

Las reducciones son donde push y pull convergen: para conocer el extremo tienes que ver la secuencia entera, así que tanto min como max son terminales y ambos devuelven un Future. Las versiones de RxDart aceptan además un comparador opcional para elementos que no son Comparable; FxDart mantiene min y max como terminales numéricos y cubre los casos con clave con minBy/maxBy. Sobre enteros planos las dos llamadas son idénticas palabra por palabra — el lado FxDart solo eleva antes los tirones a una cadena asíncrona con toAsync.

La arruga espejada es que cada reducción consume la fuente. Un stream de Dart es de suscripción única, así que pedir el mínimo y luego el máximo significa dos suscripciones — de ahí la fábrica latencies() del lado RxDart. El lado FxDart tiene la misma forma por la misma razón: una llamada terminal drena la cadena, así que la segunda reducción tira de una fresca. Ambos, por tanto, miden dos veces (recolectar primero en una lista es la alternativa compartida), y ningún modelo tiene una ventaja que merezca reclamarse: empate, decidido por hacia dónde fluye ya el código de alrededor.

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 707 µs
FxDart 628 µs

Memoria pico Empate

RxDart 16.5 MB
FxDart 16.6 MB

N = 10,000

Tiempo Gana FxDart

RxDart 65.2 ms
FxDart 61.4 ms

Memoria pico Empate

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