Emparejar sensores con lecturas y quedarse con las anomalías

Gana FxDart

Requisito

Una API de telemetría devuelve dos listas paralelas: los nombres de los sensores y sus últimas lecturas de temperatura, emparejados por posición. Emparéjalos, quédate con las lecturas por encima de 90.0 °C e imprime una línea de alerta por anomalía, en el orden de la lista. Los datos están en el código de abajo; ambas versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
boiler-2: 104.6 °C
pump-b: 93.4 °C
vent-7: 97.1 °C

Lado a lado

Dart nativo

FxDart

Por qué difieren

El núcleo de Dart no tiene zip. package:collection ofrece IterableZip, pero empareja iterables del mismo tipo —juntar un List<String> con un List<double> degrada ambos a Object y mete casts en tu predicado—, así que en la práctica los desarrolladores de Dart escriben el bucle con índice que ves aquí. El bucle es correcto, pero el emparejamiento vive en la contabilidad posicional (sensors[i], readings[i]) y no produce nada que puedas pasar más adelante ni seguir filtrando. El zip de FxDart emite pares de records tipados (String, double), así que la comprobación de anomalías y el formateo se quedan en pasos corrientes de la cadena sobre valores reales.

Benchmark

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

N = 100

Tiempo Empate

Dart nativo 6.0 µs
FxDart 6.9 µs

Memoria pico Empate

Dart nativo 16.5 MB
FxDart 16.6 MB

N = 10,000

Tiempo Empate

Dart nativo 520 µs
FxDart 572 µs

Memoria pico Empate

Dart nativo 23.7 MB
FxDart 23.7 MB

N = 1,000,000

Tiempo Gana nativo

Dart nativo 62.5 ms
FxDart 68.2 ms

Memoria pico Gana FxDart

Dart nativo 169.8 MB
FxDart 159.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í.