Descarta los null, conserva los valores
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
N = 100
Tiempo Empate
Memoria pico Empate
N = 1,000,000
Tiempo Gana FxDart
Memoria pico Gana FxDart
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í.