Comercios en orden de primera visita
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
N = 100
Tiempo Empate
Memoria pico Empate
N = 10,000
Tiempo Empate
Memoria pico Empate
N = 1,000,000
Tiempo Gana nativo
Memoria pico Empate
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í.