Suma los importes pares válidos

Gana FxDart

Requisito

Una importación de extracto produjo una lista de importes parseados en la que dos líneas no se pudieron parsear (null). Descarta los fallos, quédate con los importes pares e imprime su total. Los datos están en el código; las dos versiones deben imprimir la línea que aparece bajo Salida esperada.

Salida esperada
Even total: 202

Lado a lado

RxDart

FxDart

Por qué difieren

Los pipelines son casi idénticos palabra por palabra — whereNotNull → where → fold frente a compact → filter → sum. Lo que difiere es todo lo que hay alrededor. El lado RxDart tiene que elevar una lista corriente a un Stream, volverse asíncrono y hacer await de un fold, porque un stream solo entrega valores a lo largo de vueltas del event loop — incluso cuando todos los valores ya están en memoria. El lado FxDart sigue siendo una expresión síncrona: tirar de los valores, sumar, listo.

Ese es el tema recurrente de esta Parte: para datos que son finitos y ya están aquí, un stream añade un mecanismo de entrega que el problema nunca pidió. El vocabulario de operadores de RxDart es bueno — whereNotNull es exactamente compact — pero el modelo de debajo cobra un impuesto asíncrono en cada tarea sobre datos fijos. Aquí la respuesta entera es un número, así que la ceremonia — la elevación, el main asíncrono, el fold con await — es toda la diferencia entre los dos programas; eso es lo que sostiene el veredicto en esta página, mientras que parejas posteriores con el mismo residuo se quedan en empate. El veredicto se invierte en la Parte 4, donde los valores llegan de verdad a lo largo del tiempo y esa misma maquinaria pasa a ser el punto.

Benchmark

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

N = 100

Tiempo Empate

RxDart 11 µs
FxDart 938 ns

Memoria pico Empate

RxDart 16.5 MB
FxDart 15.9 MB

N = 1,000,000

Tiempo Gana FxDart

RxDart 84.1 ms
FxDart 12.8 ms

Memoria pico Gana FxDart

RxDart 24.2 MB
FxDart 21.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í.