Los últimos tres errores

Empate

Requisito

Del log del servicio de esta mañana, quédate solo con las líneas ERROR e imprime las tres últimas, la más antigua primero. Los datos están en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
ERROR timeout contacting registry
ERROR registry unreachable
ERROR checksum mismatch on chunk 7

Lado a lado

RxDart

FxDart

Por qué difieren

«Las tres últimas» tiene un coste estructural que ningún operador puede esquivar: no puedes saber que un elemento está entre los tres últimos hasta haber visto el final. Por eso ambos lados almacenan — una ventana de tres huecos en la que cada nuevo error entra empujando y de la que el más antiguo cae — y ambos la vuelcan solo cuando la fuente termina. El takeLast de RxDart no emite nada hasta que llega el evento done; el takeRight de FxDart mantiene la misma ventana mientras drena el iterable hasta el agotamiento. El mismo algoritmo, ajustado a la palabra de cada modelo para «no hay más elementos».

Aguas arriba de eso, where y filter son intercambiables. La única nota de modelo que merece hacerse: en un stream sin límite takeLast no emite jamás — «las tres últimas» solo tiene sentido para fuentes que terminan, territorio nativo para un iterable finito y un caso especial para un stream. En este log acotado ambos expresan el trabajo directamente, así que el veredicto es un empate.

Benchmark

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

N = 100

Tiempo Empate

RxDart 10 µs
FxDart 1.3 µs

Memoria pico Empate

RxDart 16.5 MB
FxDart 16.5 MB

N = 1,000,000

Tiempo Gana FxDart

RxDart 64.2 ms
FxDart 11.6 ms

Memoria pico Empate

RxDart 108.3 MB
FxDart 104.4 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í.