Marcadores de apertura y cierre
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
N = 100
Tiempo Empate
Memoria pico Empate
N = 1,000,000
Tiempo Gana FxDart
Memoria pico Gana RxDart
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í.