Comercios en orden de primera visita

Gana FxDart

Requisito

A partir de un mes de transacciones, lista cada comercio una sola vez, en el orden en que fue visitado por primera vez: las visitas repetidas no deben desplazar un comercio más abajo en la lista. Los datos están en el código de abajo; las dos versiones deben imprimir la línea que aparece bajo Salida esperada.

Salida esperada
Cafe Aroma, Metro Card, Green Grocer, Noodle Bar

Lado a lado

Dart nativo

FxDart

Por qué difieren

La tentadora línea nativa es toSet().toList(), y hasta imprimiría lo correcto, porque el conjunto por defecto de Dart resulta estar ordenado por inserción. Pero el contrato de Iterable.toSet no promete orden alguno, así que un código cuyo requisito es el orden de primera visita no debería apoyarse en él; la versión nativa honesta es un bucle con un conjunto de vistos, dos colecciones y un if. El uniq de FxDart hace que la garantía forme parte del nombre: conserva de forma perezosa la primera aparición de cada elemento, por contrato, en un único paso de la cadena después de map.

Benchmark

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

N = 100

Tiempo Empate

Dart nativo 1.4 µs
FxDart 1.7 µs

Memoria pico Empate

Dart nativo 16.5 MB
FxDart 16.5 MB

N = 10,000

Tiempo Empate

Dart nativo 151 µs
FxDart 168 µs

Memoria pico Empate

Dart nativo 17.0 MB
FxDart 17.0 MB

N = 1,000,000

Tiempo Gana nativo

Dart nativo 23.8 ms
FxDart 26.2 ms

Memoria pico Empate

Dart nativo 116.6 MB
FxDart 116.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í.