Emparejar sensores con lecturas y quedarse con las anomalías
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
N = 100
Tiempo Empate
Memoria pico Empate
N = 10,000
Tiempo Empate
Memoria pico Empate
N = 1,000,000
Tiempo Gana nativo
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í.