Marcadores de apertura y cierre

Empate

Requisito

Un informe de sesión lista los eventos de un usuario en orden, enmarcados por una línea == SESSION OPEN == antes del primer evento y una línea == SESSION CLOSE == después del último. Los cuatro eventos están en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
== SESSION OPEN ==
09:12 login kim
09:14 open /reports
09:26 edit budget-aug
09:41 logout kim
== SESSION CLOSE ==

Lado a lado

RxDart

FxDart

Por qué difieren

Casi en ningún sitio: esto es paridad de vocabulario. El startWith de RxDart inyecta un valor antes de la primera emisión de la fuente y endWith inyecta uno después de que la fuente se complete; el prepend y el append de FxDart son las mismas dos palabras en una cadena pull: producen el marcador antes de que el primer tirón llegue a la fuente y después de que la fuente se seque. Un operador cada uno, nombres simétricos, de primera clase en ambos lados.

La única diferencia de modelo que merece notarse es cuándo puede existir el marcador de cierre. En el lado push, endWith tiene que esperar el evento done — la posición del marcador es un hecho sobre el ciclo de vida del stream. En el lado pull, append es simplemente lo siguiente que el iterador produce una vez agotada la fuente; no hay ciclo de vida que observar, solo demanda. Para un feed finito en memoria la distinción es invisible, así que este es un empate — elige el modelo en el que ya vive el resto de tu pipeline.

Benchmark

Apple M1 Max, 32 GB de RAM · Dart 3.12.2 (compilado AOT) · 2026-08-18

N = 100

Tiempo Empate

RxDart 13 µs
FxDart 3.1 µs

Memoria pico Empate

RxDart 16.4 MB
FxDart 16.5 MB

N = 1,000,000

Tiempo Gana FxDart

RxDart 96.8 ms
FxDart 29.6 ms

Memoria pico Gana RxDart

RxDart 128.3 MB
FxDart 140.6 MB

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í.