Anomalías con su contexto alrededor

Gana FxDart

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

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

N = 100

Tiempo Empate

Dart nativo 1.6 µs
FxDart 1.5 µs

Memoria pico Empate

Dart nativo 16.5 MB
FxDart 16.4 MB

N = 10,000

Tiempo Empate

Dart nativo 113 µs
FxDart 93 µs

Memoria pico Empate

Dart nativo 18.3 MB
FxDart 18.7 MB

N = 1,000,000

Tiempo Gana FxDart

Dart nativo 11.9 ms
FxDart 10.4 ms

Memoria pico Empate

Dart nativo 132.2 MB
FxDart 131.7 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í.