Una llamada cada 100 ms

Empate async

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.