Tres lecturas consecutivas por encima del límite
Requisito
Lecturas horarias de CO2 de un día. Marca cada ventana de tres lecturas consecutivas todas por encima de 1000 ppm —eso significa que la ventilación no pudo recuperarse durante tres horas seguidas— e imprime cada ventana como un rango de horas inicio–fin bajo una línea de cabecera. Los datos están en el código de abajo; ambas versiones deben imprimir las líneas que aparecen bajo Salida esperada.
Salida esperada
Ventilation alerts (3h over 1000 ppm): 11:00–13:00 15:00–17:00
Lado a lado
Dart nativo
FxDart
Por qué difieren
Dart nativo no tiene ventana deslizante, así que la versión nativa es
un bucle con índices, con una cota i + 2 < length y tres
accesos manuales —correcto, pero cada pieza es contabilidad que quien lo
lea tiene que verificar. La versión de FxDart construye la ventana como
datos: aplica zip3 a la lista consigo misma
desplazada uno y dos lugares (drop(1),
drop(2)), y cada elemento pasa a ser una terna (lectura,
siguiente, la siguiente de esa). Sin índices por ningún lado. Que
zip3 se detenga en la entrada más corta es exactamente la
regla de «la ventana cabe entera» que el bucle codifica en su cota.
Ampliar la ventana a 4 horas es una entrada desplazada más, no una
reauditoría de la aritmética.
Las entradas desplazadas no son copias. drop(n) sobre una
List es un rango de esa lista, y zip3
lee los tres rangos por índice — así que la tubería recorre las lecturas
una sola vez y reserva una terna por ventana, que es la razón de que su
barra quede cerca del bucle y no a un múltiplo de él.
Benchmark
N = 100
Tiempo Empate
Memoria pico Empate
N = 10,000
Tiempo Empate
Memoria pico Gana nativo
N = 1,000,000
Tiempo Gana nativo
Memoria pico Empate
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í.