Informa solo de los cambios de estado
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
N = 100
Tiempo Empate
Memoria pico Empate
N = 1,000,000
Tiempo Gana FxDart
Memoria pico Gana RxDart
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í.