Numera la lista de pasos

Gana FxDart

Requisito

Convierte seis pasos de instalación en una lista de comprobación numerada — 1. Unbox the sensor kit y así sucesivamente, una línea por paso, numerando desde uno. Los datos están en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
1. Unbox the sensor kit
2. Charge the base station
3. Pair the remote
4. Mount the wall bracket
5. Run the self-test
6. Register the warranty

Lado a lado

RxDart

FxDart

Por qué difieren

Ni el Stream del core ni RxDart tienen un map con índice. Lo más cercano que ofrece RxDart es scan, cuyo acumulador casualmente recibe un índice como tercer argumento — así que la forma rx mostrada numera los pasos montándose en un fold: una semilla que tienes que inventar ('') y un valor acumulado que ignoras de inmediato. Las alternativas no son más limpias en esencia — un contador mutable sobre el que cierra el mapper, o hacer zip contra Rx.range — todas las rutas cuelan el índice desde fuera, porque ningún operador lo lleva consigo. Funciona, y aun así se lee como un apaño.

FxDart dice la cosa directamente: zipWithIndex empareja cada elemento con su posición, y un map corriente formatea la pareja. Esto no es tanto un hueco push-contra-pull como un hueco de vocabulario — un operador de emparejado con índice es trivialmente expresable en cualquiera de los dos modelos, simplemente Rx nunca lo desarrolló — pero el lector de cada panel lo nota: un lado declara «elemento con su índice», el otro lo codifica en el parámetro sobrante de un acumulador. Veredicto: FxDart.

Benchmark

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

N = 100

Tiempo Empate

RxDart 21 µs
FxDart 11 µs

Memoria pico Empate

RxDart 16.5 MB
FxDart 16.5 MB

N = 1,000,000

Tiempo Gana FxDart

RxDart 206.9 ms
FxDart 153.9 ms

Memoria pico Empate

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