Dart vs FxDart

La misma tarea real, resuelta dos veces: Dart puro a la izquierda, FxDart a la derecha. Las dos versiones se ejecutan en tu navegador e imprimen exactamente la misma salida — compáralas y decide por ti mismo.

Un apunte de honestidad antes de la lista: el Iterable integrado de Dart ya es perezoso, y las cadenas sencillas de where/map son código Dart perfectamente válido. FxDart no está aquí para ganarles. Lo que aporta es vocabulario (groupBy, chunk, zip, scan, uniqBy, partition — cosas que el Dart de base te obliga a escribir a mano), composición (una única cadena tipada fx() en lugar de llamadas anidadas y variables intermedias) y, sobre todo, control de la concurrencia: .concurrent(n) ejecuta un pipeline asíncrono n elementos a la vez, en orden, algo que el Dart puro solo puede aproximar con pools de workers escritos a mano. Cada ejemplo lleva una insignia de veredicto, y algunos dicen que el Dart nativo está bien. De eso se trata: cuando un ejemplo dice que gana FxDart, puedes creértelo.

Gana FxDart — aquí es claramente mejor · Empate — igual de buenos, elige por gusto · Dart nativo basta — Dart puro lo resuelve bien · async — usa pipelines asíncronos

Dos perspectivas por ejemplo: la insignia rellena juzga el código — qué versión es más agradable de escribir y leer. La insignia ⚡ con contorno informa la medición — el ganador en tiempo de ejecución al mayor tamaño del benchmark, compilado AOT; la sección Benchmark de cada página tiene las barras completas.

Si solo vas a leer cinco, lee estos: #1 Los 3 gastos más grandes · #11 Los 5 comercios con más gasto total · #23 Enriquecer los principales comercios de forma concurrente · #31 Informe de gastos multidivisa · #53 Bajadas de precio entre dos instantáneas

Parte 1 · Dos funciones

Tareas de una línea del día a día. Aquí Dart nativo suele estar a la altura: fíjate en las insignias de veredicto.

  1. 1 Los 3 gastos más grandes Empate ⚡ FxDart más rápido Las tres transacciones más grandes del mes — sortedBy + take de package:collection frente a sortBy + take en FxDart.
  2. 2 Nivel de log más frecuente Gana FxDart ⚡ FxDart más rápido Contar entradas de log por nivel y quedarse con el mayor — groupListsBy + reduce en Dart nativo frente a countBy + maxBy en FxDart.
  3. 3 Cargar tres configuraciones remotas en orden Gana FxDart async ⚡ Misma velocidad Peticiones asíncronas secuenciales — un simple await dentro de un bucle en Dart frente a toAsync + map en FxDart, a una palabra de la concurrencia acotada.
  4. 4 Valor medio de los pedidos de más de $100 Empate ⚡ FxDart más rápido Total medio de los pedidos grandes — where/map/average con package:collection frente a filter + averageBy en FxDart.
  5. 5 Agrupar usuarios en páginas de 10 Gana FxDart ⚡ FxDart más rápido Divide una lista de usuarios en páginas de tamaño fijo — slices de package:collection frente a chunk + map en FxDart.
  6. 6 Etiquetas de puesto para una tabla de clasificación Empate ⚡ Misma velocidad Numera de 1 a n una tabla de clasificación ya ordenada — los records de indexed de Dart 3 frente a zipWithIndex + map en FxDart.
  7. 7 Saldo acumulado de una cuenta Gana FxDart ⚡ Nativo más rápido El saldo después de cada transacción — un bucle con acumulador mutable en Dart nativo frente a scan + map en FxDart.
  8. 8 Gasto en comida este mes Gana FxDart ⚡ FxDart más rápido Suma una sola categoría de un libro de cuentas — una cadena where/fold en Dart nativo frente a filter + sumBy en FxDart.
  9. 9 Comercios en orden de primera visita Gana FxDart ⚡ Nativo más rápido Deduplicación que preserva el orden — un bucle con conjunto de vistos en Dart nativo frente a map + uniq en FxDart.
  10. 10 La primera lectura del sensor por encima del límite Dart nativo basta ⚡ Misma velocidad Encuentra la primera temperatura por encima de un umbral — skipWhile + firstOrNull en Dart nativo frente a dropWhile + head en FxDart.

Parte 2 · Tres funciones

El vocabulario que le falta a Dart nativo empieza a compensar: groupBy, uniqBy, partition, scan.

  1. 11 Los 5 comercios con más gasto total Gana FxDart ⚡ FxDart más rápido Agrupar un libro de cuentas por comercio y ordenar los totales — groupListsBy + sortedBy en Dart nativo frente a una sola cadena groupedBy → sortByDesc → take en FxDart.
  2. 12 Todas las etiquetas de las entradas, ordenadas Empate ⚡ FxDart más rápido Aplanar las etiquetas de las entradas en una sola lista ordenada y sin repetidos — expand + toSet + sort en Dart nativo frente a flatMap + uniq + sort en FxDart. Un empate en la página, 1,5× en el reloj.
  3. 13 Reembolsos frente a cargos, ambos formateados Gana FxDart ⚡ FxDart más rápido Divide un libro de cuentas en reembolsos y cargos e imprime ambos lados — dos pasadas de where en Dart nativo frente a un solo partition en FxDart.
  4. 14 Los 5 primeros correos válidos, normalizados Dart nativo basta ⚡ FxDart más rápido Recortar, pasar a minúsculas, validar y tomar cinco — map/where/take en Dart nativo frente a map + filter + take en FxDart. Aquí Dart nativo es igual de limpio.
  5. 15 Obtener perfiles de dos en dos Gana FxDart async ⚡ Nativo más rápido Concurrencia acotada y en orden — un pool de workers hecho a mano en Dart nativo frente a toAsync + map + concurrent en FxDart.
  6. 16 Tabla de interés compuesto Gana FxDart ⚡ Nativo más rápido Una tabla de saldos año a año al 5% — un bucle con acumulador mutable en Dart nativo frente a range + scan + map en FxDart.
  7. 17 Categoría con el gasto medio más alto Gana FxDart ⚡ Nativo más rápido Agrupar gastos y encontrar la categoría más cara por transacción — llamadas anidadas a groupBy + maxBy de collection en Dart nativo frente a una sola cadena de FxDart.
  8. 18 Gasto dentro de una ventana de fechas Empate ⚡ FxDart más rápido Suma un tramo de un libro ordenado por fecha — skipWhile/takeWhile/fold en Dart nativo frente a dropWhile + takeWhile + sumBy en FxDart. Dart nativo aguanta bien.
  9. 19 Emparejar sensores con lecturas y quedarse con las anomalías Gana FxDart ⚡ Nativo más rápido Une dos listas paralelas y señala las lecturas altas — un bucle con índice en Dart nativo (el núcleo no tiene zip) frente a zip + filter + map en FxDart.
  10. 20 Mensajes de error recientes, sin duplicados Gana FxDart ⚡ Nativo más rápido Los tres errores distintos más recientes de un log ordenado de más nuevo a más antiguo — un bucle con un Set de vistos y un break en Dart nativo frente a filter + uniqBy + take en FxDart.

Parte 3 · Cinco funciones

Informes y pipelines reales: donde la composición mantiene legible una lógica de varios pasos.

  1. 21 Detectar transacciones duplicadas Gana FxDart ⚡ Misma velocidad Marca los cargos con el mismo comercio, importe y día — putIfAbsent más bucles anidados en Dart nativo frente a groupBy + filter + flatMap en FxDart.
  2. 22 La racha más larga de días sin gastar Gana FxDart ⚡ Misma velocidad La racha más larga de días de julio sin ninguna transacción — bucle con contadores de racha y máximo en Dart nativo frente a range + scan + max en FxDart.
  3. 23 Enriquecer los principales comercios de forma concurrente Gana FxDart async ⚡ Nativo más rápido Elegir los 3 comercios principales y consultar cada uno en una API con límite de tasa, de dos en dos — un pool de workers hecho a mano en Dart nativo frente a concurrent(2) en FxDart.
  4. 24 Tabla de clasificación con puestos empatados Gana FxDart ⚡ FxDart más rápido Clasifica jugadores de modo que las puntuaciones iguales compartan puesto — estado mutable rank/prevScore en Dart nativo frente a sortBy + groupBy + zipWithIndex en FxDart.
  5. 25 Medias semanales a partir de lecturas diarias Gana FxDart ⚡ Misma velocidad Plegar 21 lecturas diarias en 3 medias semanales — aritmética de índices y sublist en Dart nativo frente a chunk + averageBy + zipWithIndex en FxDart.
  6. 26 Listado de productos paginado Empate ⚡ Nativo más rápido Filtra, ordena por precio y extrae la página 2 — Dart ya tiene skip/take, así que este caso es un empate de verdad.
  7. 27 De líneas de pedido a resumen de factura Gana FxDart ⚡ FxDart más rápido Convierte las líneas de un pedido en totales por categoría más un total general — dos modismos de bucle y fold en Dart nativo frente a groupBy + sumBy + sortBy en FxDart.
  8. 28 Categorías que superan su presupuesto mensual Gana FxDart ⚡ FxDart más rápido Gasto total por categoría, quedarse con las que se pasan del presupuesto y ordenarlas por exceso — contabilidad con mapas mutables en Dart nativo frente a groupBy + filter + sortBy en FxDart.
  9. 29 Informe mensual por categorías, ordenado por gasto Gana FxDart ⚡ Nativo más rápido Filtra un libro de cuentas a un solo mes, suma cada categoría y ordénalas — bucle más mapa mutable en Dart nativo frente a filter + groupBy + sortBy en FxDart.
  10. 30 Tres lecturas consecutivas por encima del límite Gana FxDart ⚡ Nativo más rápido Encuentra cada ventana de 3 horas de lecturas de CO2 todas por encima de 1000 ppm — un bucle con índices en Dart nativo frente a una ventana deslizante construida con zip3 + drop en FxDart.

Parte 4 · De seis a diez funciones

Flujos de trabajo completos, casi todos con concurrencia acotada: la parte que Dart nativo no sabe expresar con elegancia.

  1. 31 Informe de gastos multidivisa Gana FxDart ⚡ FxDart más rápido Normaliza a USD el libro de cuentas de un viaje con tipos fijos y luego agrupa, ordena y resume — un pipeline por línea de informe frente al boilerplate de fold/reduce.
  2. 32 Plan de reposición de inventario Gana FxDart ⚡ FxDart más rápido Prioriza los artículos por debajo del umbral y corta la lista de pedidos al llegar al presupuesto — scan + zip + takeWhile como flujo de datos frente a un total acumulado mutable y un break.
  3. 33 Consulta concurrente de precios con fallback Gana FxDart async ⚡ Misma velocidad Consulta precios en vivo de tres en tres y recurre a los precios de catálogo para los SKU que faltan — concurrent + un map con ?? frente a un pool de workers.
  4. 34 Informe mensual completo del libro de cuentas Gana FxDart ⚡ FxDart más rápido Un único informe a partir de un libro de cuentas — total, desglose por categorías, comercios principales — como tres pipelines de fxdart frente a bucles y mapas intermedios.
  5. 35 Rellenar huecos en una serie temporal dispersa Gana FxDart ⚡ FxDart más rápido Los días sin transacciones pasan a 0.00, y luego filas semanales con totales — range + groupBy + chunk como un solo flujo frente a un bucle con contador y slices.
  6. 36 Descargas en paralelo, resultados en orden Gana FxDart async ⚡ Nativo más rápido Seis descargas con velocidades distintas, 3 a la vez — concurrent mantiene el orden de las peticiones aunque las finalizaciones se entrelacen, frente a la contabilidad de un pool.
  7. 37 Diff de dos snapshots de un libro de cuentas Gana FxDart ⚡ Nativo más rápido Entradas añadidas, eliminadas y sin cambios entre dos snapshots — differenceBy e intersectionBy por id frente a conjuntos de id construidos a mano y filtros where.
  8. 38 Sondear una API inestable hasta el primer éxito Gana FxDart async ⚡ Nativo más rápido Reintentar hasta que esté listo, como pipeline perezoso — range + toAsync + map + dropWhile + head frente a un bucle de sondeo imperativo con un break.
  9. 39 Resumen de alertas de log por servicio y severidad Gana FxDart ⚡ Misma velocidad Logs WARN y ERROR presentados como un resumen con sangría — agrupación anidada con groupBy + flatMap + uniq frente a tres bucles anidados y un conjunto seen.
  10. 40 Latencia p50/p95 por endpoint Gana FxDart ⚡ Misma velocidad Tabla de percentiles a partir de logs de peticiones en crudo — groupBy + sortBy + nth por endpoint frente a un bucle que acumula filas con ordenaciones in situ.
  11. 41 Dos feeds paginados, concatenados y deduplicados Gana FxDart async ⚡ Nativo más rápido Vacía un almacén de logs primario, luego su réplica, deduplica por id y para en 8 — concat + uniqBy + take siguen siendo perezosos, frente a bucles anidados con un conjunto de vistos.
  12. 42 Anomalías con su contexto alrededor Gana FxDart ⚡ FxDart más rápido Muestra las lecturas de sensor por encima del límite más una línea antes y otra después — zipWithIndex + flatMap + uniq como un solo pipeline frente a un conjunto de índices construido en bucles anidados.
  13. 43 Cambios de zona suavizados Gana FxDart ⚡ FxDart más rápido Media móvil, rachas de zona y alertas de transición — tres bucles con estado mutable en Dart puro vs windowed → uniqAdjacentBy → pairwise en FxDart.
  14. 44 Alertas por ventanas sobre un stream de sensores Gana FxDart async ⚡ Nativo más rápido Trocear un Stream real de Dart en ventanas fijas y lanzar alertas — fromStream + chunk + averageBy frente a llevar el búfer a mano dentro de un await-for.
  15. 45 Búsqueda en vivo sobre un stream de pulsaciones Gana FxDart async ⚡ Nativo más rápido Convierte un stream de pulsaciones en búsquedas de backend sin duplicados — fromStream + filter + uniq + take + map frente a await-for con cláusulas de guarda.
  16. 46 Importación por lotes con límite de tasa Gana FxDart async ⚡ Nativo más rápido Importa 9 transacciones en lotes de 3, un lote cada vez, con un total acumulado — chunk + concurrent(1) + scan frente a un bucle secuencial.
  17. 47 Ranking del mes por categoría Gana FxDart ⚡ Misma velocidad Agrupar, totalizar y rankear el gasto — groupListsBy más el volteo del comparador en Dart nativo frente a una sola cadena groupedBy → sortByDesc en FxDart.
  18. 48 Revaluar el stock, tres consultas a la vez Gana FxDart async ⚡ Nativo más rápido Consultas de precios en vivo con respaldo — un pool de workers y pares hechos a mano en Dart nativo frente a attach + concurrent + countWhere en FxDart.
  19. 49 Obtener 10 perfiles, de tres en tres Gana FxDart async ⚡ Misma velocidad Preparación síncrona que desemboca directamente en concurrencia acotada — filter y sort, luego toAsync + map + concurrent(3), frente a un pool de workers hecho a mano.
  20. 50 Tabla de retención por cohortes Gana FxDart ⚡ Misma velocidad Cohortes por mes de alta frente a la actividad posterior — pipelines anidados de groupBy/dropWhile/filter frente a bucles for anidados con listas acumuladoras.
  21. 51 Gran final — cierre mensual de DailyLedger Gana FxDart async ⚡ Misma velocidad El gran final: carga las entradas del libro de 3 en 3 y luego calcula el resumen de julio y el desglose por categoría — las formas reales de la app DailyLedger, de las dos maneras.
  22. 52 Pipeline de liquidación de cierre de día Gana FxDart async ⚡ FxDart más rápido Validar, agrupar por comercio, publicar de dos en dos y luego informar — una sola cadena que cruza de síncrono a asíncrono, frente a groupListsBy más un pool de workers.
  23. 53 Bajadas de precio entre dos instantáneas Gana FxDart ⚡ FxDart más rápido Compara dos instantáneas de una lista de precios e informa de lo que se abarató — indexBy + filter + sortBy + head + sumBy frente a un literal de Map y cadenas where/fold.