Informa solo de los cambios de estado

Empate

Requisito

Un feed de health checks informa ok, ok, warn, warn, ok, ok, ok — repetición sobre todo. Imprime una línea status now por racha (tres líneas), y luego una única línea statuses seen: que liste cada estado distinto en orden de primera aparición. Los datos están en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
status now: ok
status now: warn
status now: ok
statuses seen: ok, warn

Lado a lado

RxDart

FxDart

Por qué difieren

La deduplicación adyacente — «avísame cuando el valor cambie» — es un valor de estado recordado en cualquiera de los dos modelos, y los dos lados son gemelos línea a línea. La única trampa es el nombrado, y corta en direcciones opuestas. En el lado stream, el Stream.distinct corriente es ya solo adyacente — RxDart añade distinctUnique para la versión global que mucha gente espera que sea distinct. FxDart lo nombra al revés: uniq es global, como el uniq de cualquier biblioteca de colecciones, y uniqAdjacent dice la adyacencia en voz alta.

Las dos parejas se muestran arriba a propósito: el colapso de rachas con distinct / uniqAdjacent, el resumen de vistos-en-cualquier-parte con distinctUnique / uniq. Fíjate en lo que cuestan las versiones globales en cada modelo — un conjunto de «vistos» que crece en ambos casos, pero el del stream debe mantenerlo durante la vida (potencialmente ilimitada) de una suscripción, y por eso RxDart hace de la forma global la opción explícita. En un feed finito como este los modelos no se separan en absoluto: empate.

Benchmark

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

N = 100

Tiempo Empate

RxDart 20 µs
FxDart 4.1 µs

Memoria pico Empate

RxDart 16.5 MB
FxDart 16.4 MB

N = 1,000,000

Tiempo Gana FxDart

RxDart 124.1 ms
FxDart 32.0 ms

Memoria pico Gana RxDart

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