Tres lecturas consecutivas por encima del límite

Gana FxDart

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

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

N = 100

Tiempo Empate

Dart nativo 2.1 µs
FxDart 2.4 µs

Memoria pico Empate

Dart nativo 16.4 MB
FxDart 16.5 MB

N = 10,000

Tiempo Empate

Dart nativo 114 µs
FxDart 173 µs

Memoria pico Gana nativo

Dart nativo 20.5 MB
FxDart 23.5 MB

N = 1,000,000

Tiempo Gana nativo

Dart nativo 17.1 ms
FxDart 20.3 ms

Memoria pico Empate

Dart nativo 149.8 MB
FxDart 148.0 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í.