Deltas entre ticks

Empate

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

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

N = 100

Tiempo Empate

RxDart 86 µs
FxDart 42 µs

Memoria pico Empate

RxDart 16.6 MB
FxDart 16.5 MB

N = 1,000,000

Tiempo Gana FxDart

RxDart 762.6 ms
FxDart 439.3 ms

Memoria pico Empate

RxDart 159.2 MB
FxDart 162.6 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í.