Un valor actual en vivo para lectores tardíos
Requisito
Un feed de temperatura empuja actualizaciones con un calendario fijo. Un panel se conecta solo después de que las tres primeras actualizaciones ya hayan pasado — aun así debe mostrar el valor actual de inmediato (19.1 °C, el más reciente en el momento de unirse), y luego cada actualización posterior. El calendario está simulado en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.
Salida esperada
joined late, current: 19.1 update: 19.5 update: 20.0
Lado a lado
RxDart
FxDart
Por qué difieren
No difieren. «El último valor, reemitido a quien aparezca» es
estado compartido y multicast, y fxdart también tiene un
objeto dedicado para ello: LiveValue
es BehaviorSubject reducido a su comportamiento
definitorio — un sumidero en el que el sensor escribe, un
.value legible, y un feed donde un suscriptor tardío
recibe primero el valor más reciente, y luego las actualizaciones en
vivo. Ambos paneles son «añadir actualizaciones, suscribirse tarde,
recoger» — sin variable cacheada a mano y sin oyente extra de caché.
Esta es la capa de eventos de fxdart absorbiendo el enfoque Rx
para el lado push: LiveValue.live devuelve una cadena
fxEvents — un envoltorio fino sobre un
Stream broadcast llano, así que no colisiona con nada,
rxdart incluido — y .pull() cruza al pipeline pull
tipado cuando el procesamiento por valor crece. La familia de
subjects y el catálogo de operadores de RxDart siguen siendo mucho
más amplios; para el último-valor-y-luego-en-vivo en sí, los paneles
son equivalentes: empate.
Benchmark
Sin benchmark para este ejemplo. Este operador se define por el tiempo transcurrido, no por el trabajo realizado: ambos lados esperan las mismas ventanas, así que una barra estaría midiendo los temporizadores de Dart y no las librerías. Acortar las ventanas tampoco sirve — cuántos valores produce una ráfaga pasaría a depender de lo rápida que sea la máquina, y ya no se podría comprobar que ambos lados dan un resultado idéntico. Por eso los ejemplos construidos sobre operadores de temporización se dejan sin medir; los que solo usan retardos para simular E/S sí se miden, con esos retardos puestos a cero.