Muestrear el medidor en cada tick de sondeo
Requisito
Un medidor de presión emite lecturas 1..8, una cada 50 ms. Un panel sondea tres veces — a los 125, 275 y 425 ms — y cada sondeo debe mostrar la lectura más reciente en ese instante: 2, 5 y luego 8. Imprime las tres lecturas sondeadas después de que los streams se cierren. Ambos calendarios están simulados en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.
Salida esperada
poll 1: reading 2 poll 2: reading 5 poll 3: reading 8
Lado a lado
RxDart
FxDart
Por qué difieren
No difieren. «El valor más reciente en este instante» solo existe
en el modelo push — presupone que las cosas llegan por su cuenta — y
ambos paneles lo expresan como la misma frase de un solo
operador: el stream del medidor, muestreado por el stream de sondeo.
RxDart escribe gauge().sample(polls()); fxdart escribe
fxEvents(gauge()).sampleOn(polls()). En ambos, el
estado de «¿qué es lo actual?» vive dentro del operador, cada
disparo emite la lectura más nueva desde el anterior, y las lecturas
no muestreadas simplemente se descartan.
Los pipelines pull siguen sin tener reloj ni «valor actual» — esa
negativa se mantiene. En su lugar, fxdart absorbe el
enfoque Rx en una capa de eventos dedicada: fxEvents es
una cadena envoltorio fina sobre Streams llanos (nunca
una extensión, así que no colisiona con nada) que posee los verbos
nativos del push que el lado pull no quiso tener. El catálogo de
operadores de RxDart sigue siendo mucho más amplio; este verbo,
fxdart lo habla de forma nativa. Y si cada lectura muestreada
fuera el inicio de trabajo real aguas abajo, .pull()
entrega las muestras al pipeline FxAsync tipado,
tiradas bajo demanda.
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.