Deltas entre ticks
Requisito
A partir de siete ticks de precio, imprime los seis
deltas: cada tick junto a su predecesor con el cambio
con signo a dos decimales (un tick plano imprime +0.00).
Los datos están en el código; las dos versiones deben imprimir las
líneas que aparecen bajo Salida esperada.
Salida esperada
101.20 -> 101.65 +0.45 101.65 -> 101.40 -0.25 101.40 -> 102.10 +0.70 102.10 -> 102.10 +0.00 102.10 -> 101.85 -0.25 101.85 -> 102.30 +0.45
Lado a lado
RxDart
FxDart
Por qué difieren
No difieren, por diseño: pairwise es uno de los
operadores que FxDart portó desde Rx, porque «cada valor con
el anterior» es igual de natural tanto si los valores se empujan como
si se tira de ellos. Ambos lados guardan un valor de estado, no emiten
nada para el primer tick y producen n − 1 parejas. El
veredicto es un empate y la parte interesante es la pequeña diferencia
de tipado en qué es una «pareja».
El pairwise de RxDart emite una
List<double> de dos elementos —
p.first y p.last son honestos, pero el
invariante de longitud 2 vive en la documentación, no en el tipo. El
de FxDart emite un record de Dart (double, double):
p.$1 y p.$2 son los únicos campos que hay, y
el compilador lo sabe. Eso es más un artefacto de la época del
lenguaje que una diferencia de modelo — los records no existían cuando
la API de RxDart se congeló — pero es representativo del hábito de la
biblioteca pull de empujar los invariantes hacia los tipos. Sobre el
modelo en sí: nada que elegir entre ellos aquí.
Benchmark
N = 100
Tiempo Empate
Memoria pico Empate
N = 1,000,000
Tiempo Gana FxDart
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í.