Tabla de clasificación con puestos empatados

Gana FxDart

Requisito

Imprime una tabla de clasificación a partir de las puntuaciones de seis jugadores, de mayor a menor, donde las puntuaciones iguales comparten puesto: ranking denso, así que dos jugadores con 87 puntos son ambos el #2 y la siguiente puntuación por debajo es el #3. Los datos están en el código de abajo; las dos versiones deben imprimir las líneas que aparecen bajo Salida esperada.

Salida esperada
#1 Leo — 92 pts
#2 Mina — 87 pts
#2 Anton — 87 pts
#3 Sofia — 75 pts
#3 Kai — 75 pts
#4 Bea — 60 pts

Lado a lado

Dart nativo

FxDart

Por qué difieren

Los empates obligan al bucle nativo a arrastrar dos piezas de estado mutable —el rank actual y la puntuación anterior— y la regla de empate vive dentro de un if cuya corrección compruebas reproduciendo el bucle en tu cabeza. La versión con FxDart declara la estructura en su lugar: sortBy descendente, groupBy por puntuación (un grupo por puesto), recorrer los grupos con entries + zipWithIndex (índice de grupo = puesto) y flatMap para devolver cada grupo a líneas de jugador. «Las puntuaciones iguales comparten puesto» deja de ser un comportamiento emergente del bucle y pasa a ser la forma del pipeline.

Benchmark

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

N = 100

Tiempo Empate

Dart nativo 22 µs
FxDart 26 µs

Memoria pico Empate

Dart nativo 16.4 MB
FxDart 16.6 MB

N = 10,000

Tiempo Empate

Dart nativo 2.41 ms
FxDart 2.37 ms

Memoria pico Empate

Dart nativo 23.5 MB
FxDart 24.1 MB

N = 1,000,000

Tiempo Gana FxDart

Dart nativo 533.8 ms
FxDart 470.7 ms

Memoria pico Empate

Dart nativo 231.5 MB
FxDart 228.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í.