Descarta los null, conserva los valores

Empate

Requisito

Un monitor de batería produjo nueve muestras de voltaje, tres de las cuales el sensor perdió (null). Descarta los fallos, imprime cada muestra superviviente formateada a un decimal y luego informa de cuántas se perdieron. Los datos están en el código; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
3.4 V
3.9 V
4.1 V
3.7 V
4.4 V
4.0 V
Dropped 3 empty samples

Lado a lado

RxDart

FxDart

Por qué difieren

whereNotNull es compact — el mismo operador vistiendo la convención de nombres de cada biblioteca. Ambos hacen lo que importa más allá de filtrar: estrechan el tipo estático, convirtiendo un tipo de elemento double? en double, de modo que la llamada a toStringAsFixed aguas abajo no necesita comprobaciones de null ni !. Filtrar y promover en una sola palabra, en ambos lados.

Así que el veredicto es un empate en vocabulario — y el resto honesto es solo el modelo de entrega. La versión stream eleva a un Stream una lista que ya tiene en la mano y espera con await a recuperar la colección; la versión pull termina antes de que el primer await de la versión stream hubiera llegado a ejecutarse. En una lista fija de nueve elementos esa sobrecarga es lo bastante pequeña como para encogerse de hombros — exactamente la diferencia entre este ejemplo y la agregación que carga con el veredicto en Suma los importes pares válidos: aquí el punto es que las dos bibliotecas están de acuerdo, hasta en la promoción de tipos.

Benchmark

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

N = 100

Tiempo Empate

RxDart 24 µs
FxDart 11 µs

Memoria pico Empate

RxDart 16.5 MB
FxDart 16.5 MB

N = 1,000,000

Tiempo Gana FxDart

RxDart 208.6 ms
FxDart 126.3 ms

Memoria pico Gana FxDart

RxDart 123.0 MB
FxDart 116.8 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í.