Cargar tres configuraciones remotas en orden

Gana FxDart async

Requisito

Carga tres secciones de configuración remota —features, limits, theme— desde una API (simulada), de una en una y en orden, y después imprime cada valor cargado. La petición falsa tarda 15 ms fijos; ambas versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
features -> {darkMode: true, beta: false}
limits -> {maxUpload: 25, rateLimit: 120}
theme -> {accent: teal, density: compact}

Lado a lado

Dart nativo

FxDart

Por qué difieren

Para tres await secuenciales, el bucle for nativo va perfectamente —nadie necesita una librería para escribirlo, y si la historia acabara aquí esto sería un empate—. La victoria de FxDart está en lo que el código llega a ser después: toAsync().map(fetchConfig) es un pipeline asíncrono perezoso que es secuencial por defecto, y el día que tengas treinta configuraciones en lugar de tres, añadir .concurrent(8) convierte esa misma cadena en un pool de workers acotado —orden preservado, sin tocar nada más—. El bucle nativo no tiene semejante mando; hay que reescribirlo. Mira Obtener perfiles de dos en dos para ese desenlace.

Benchmark

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

Caso async: la escala principal es N = 100,000, no 1,000,000. Cada elemento cuesta una vuelta del event loop en ambos lados, así que un millón de awaits reales mediría el event loop de Dart durante minutos — no el pipeline. Los retardos son de longitud cero y se conserva el límite de concurrencia del ejemplo; lo que comparan las barras es la maquinaria del pipeline.

N = 100

Tiempo Empate

Dart nativo 427 µs
FxDart 321 µs

Memoria pico Empate

Dart nativo 16.5 MB
FxDart 16.6 MB

N = 10,000

Tiempo Empate

Dart nativo 31.4 ms
FxDart 31.2 ms

Memoria pico Empate

Dart nativo 50.7 MB
FxDart 51.1 MB

N = 100,000

Tiempo Empate

Dart nativo 323.5 ms
FxDart 329.8 ms

Memoria pico Empate

Dart nativo 82.6 MB
FxDart 82.1 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í.