틱 사이의 변화량
요구사항
가격 틱 일곱 개에서 여섯 개의 변화량을 출력하세요:
각 틱을 직전 틱 옆에 놓고, 부호 있는 변화를 소수점 두 자리로(변화
없는 틱은 +0.00을 출력합니다). 데이터는 아래 코드에
있으며, 두 버전 모두 예상 출력 아래에 표시된 줄들을 출력해야
합니다.
예상 출력
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
나란히 보기
RxDart
FxDart
차이가 나는 이유
다르지 않습니다. 그것도 설계상으로요: pairwise는 FxDart가
Rx로부터 이식해 온 연산자 중 하나입니다. "각 값을 바로 앞의
값과 함께"는 값이 push되든 pull되든 똑같이 자연스럽기 때문입니다.
양쪽 모두 상태 값 하나를 유지하고, 첫 틱에는 아무것도 내보내지 않고,
n − 1개의 쌍을 만듭니다. 판정은 무승부이고, 흥미로운
부분은 "쌍"이 무엇인가에 관한 작은 타이핑 차이입니다.
RxDart의 pairwise는 요소 두 개짜리
List<double>을 내보냅니다 — p.first와
p.last는 정직하지만, 길이가 2라는 불변식은 타입이 아니라
문서에 삽니다. FxDart의 것은 Dart 레코드
(double, double)을 내보냅니다: p.$1과
p.$2가 존재하는 필드의 전부이고, 컴파일러가 그것을
압니다. 이것은 모델 차이라기보다 언어 세대의 산물입니다 — RxDart의
API가 동결될 때 레코드는 존재하지 않았습니다 — 하지만 불변식을 타입
속으로 밀어 넣는 pull 라이브러리의 습관을 잘 보여 줍니다. 모델
자체에 관해서라면: 여기서는 고를 것이 없습니다.
벤치마크
N = 100
시간 무승부
최대 메모리 무승부
N = 1,000,000
시간 FxDart 승
최대 메모리 무승부
막대는 사이드별로 새 프로세스에서 반복 측정한 중앙값입니다(작은 N은 타이머 해상도를 위해 배치 처리). 두 사이드가 서로 5% 이내이거나 — 사람이 지각할 수 없는 차이인 0.6ms 이내이면 — 무승부로 칩니다. 상대 차이가 근소한 경우는 최대 5회까지 다시 측정합니다. 앱에서는 어느 막대가 짧든 몇 밀리초 이하의 차이는 사용자에게 보이지 않습니다. 메모리는 프로세스 최대 RSS입니다. Dart VM과 데이터셋은 양쪽이 동일하므로, 두 막대의 차이가 곧 파이프라인 자체가 붙들고 있는 양입니다.