Anomalías con su contexto alrededor
Requisito
Un sensor de temperatura registró diez lecturas (los datos están en el
código). Imprime todas las lecturas por encima de
80.0 C —marcadas con !— junto con la lectura
inmediatamente anterior y posterior, tal como
grep -C1 muestra las líneas de contexto. Donde las ventanas
de contexto se solapan, cada lectura aparece una sola vez. Termina con la
lectura máxima. Ambas versiones deben imprimir el bloque que aparece bajo
Salida esperada.
Salida esperada
Readings above 80.0 C, with context 09:05 64.8 C ! 09:10 91.2 C 09:15 66.0 C 09:20 67.4 C ! 09:25 84.9 C ! 09:30 88.3 C 09:35 70.2 C Peak: 91.2 C at 09:10
Lado a lado
Dart nativo
FxDart
Por qué difieren
«Cada coincidencia se expande a una ventana y luego las ventanas que se
solapan se fusionan» es un problema de aplanar y deduplicar, y FxDart lo
escribe exactamente así: zipWithIndex conserva las
posiciones, filter encuentra las anomalías,
flatMap expande cada una a [i-1, i, i+1] y
uniq fusiona los solapamientos —una única expresión
ininterrumpida que va de las lecturas a las líneas impresas. Dart nativo
no tiene un modismo de flatMap-hacia-uniq para
esto, así que la versión natural construye un
Set<int> de índices en bucles for
anidados, lo ordena y da formato en un segundo bucle —el mismo
algoritmo, pero partido en tres fases mutables.
Benchmark
N = 100
Tiempo Empate
Memoria pico Empate
N = 10,000
Tiempo Empate
Memoria pico Empate
N = 1,000,000
Tiempo Gana FxDart
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í.