Una llamada cada 100 ms
Requisito
Envía cinco pings a un endpoint con límite de tasa, cada uno
empezando al menos 100 ms después del anterior.
Registra el arranque de cada llamada en un Stopwatch
monotónico, imprime las cinco respuestas, e imprime
spaced: true solo si todos los huecos respetaron el
límite. Las dos versiones deben imprimir las líneas que aparecen bajo
Salida esperada.
Salida esperada
pong #1 pong #2 pong #3 pong #4 pong #5 spaced: true
Lado a lado
RxDart
FxDart
Por qué difieren
El espaciado va de tiempo, así que cabría esperar que el stream
ganara — y RxDart sí tiene la palabra para ello:
interval retiene cada evento 100 ms antes de que
llegue al ping, y el backpressure mantiene todo el asunto secuencial.
Un operador, requisito cumplido.
Pero un pipeline pull es secuencial por defecto, y eso convierte el
espaciado en algo casi vergonzosamente simple: pon el delay
dentro del mapper. Cada pull espera 100 ms y luego
llama — el siguiente pull no puede empezar hasta que este termine,
así que el espaciado es estructural, sin operador alguno. La
comprobación con Stopwatch imprime spaced: true en ambos
lados. Llámalo un empate con una salvedad por bando: RxDart nombra el
concepto explícitamente, lo que se lee mejor en un pipeline lleno de
otros operadores de tiempo; a FxDart le sale como consecuencia de una
línea de la demanda, pero solo porque esta tarea quiere llamadas
estrictamente seriales — para espaciar eventos que llegan con su
propio calendario (un stream de eventos real), acude al lado stream
del puente (fxStream) y al vocabulario temporal de
RxDart.
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.