판독값 3개 이동 평균

FxDart 승

요구사항

시간별 온도 판독값 여덟 개를 판독값 3개 이동 평균으로 매끄럽게 만드세요: 연속된 판독값 3개의 모든 윈도우에 대해, 윈도우와 그 평균을 소수점 한 자리로 출력합니다 — 완전한 윈도우 여섯 개, 부분 윈도우는 없습니다. 데이터는 아래 코드에 있으며, 두 버전 모두 예상 출력 아래에 표시된 줄들을 출력해야 합니다.

예상 출력
21.0 21.6 22.4 -> avg 21.7
21.6 22.4 23.1 -> avg 22.4
22.4 23.1 22.8 -> avg 22.8
23.1 22.8 22.2 -> avg 22.7
22.8 22.2 21.9 -> avg 22.3
22.2 21.9 21.4 -> avg 21.8

나란히 보기

RxDart

FxDart

차이가 나는 이유

RxDart는 슬라이딩 윈도우를 배칭의 매개변수화로 표기합니다: bufferCount(3, 1) — 크기 3의 버퍼를 이벤트 하나마다 새로 시작. 동작은 하지만, 이 부호화는 두 군데서 샙니다. 두 번째 인자가 startBufferEvery이고 1이 "슬라이딩"을 뜻한다는 것을 알고 있어야 하고; 스트림 끝에서 연산자가 아직 열려 있는 버퍼들을 흘려보내므로 [21.9, 21.4] 같은 램프다운 부분 윈도우까지 튀어나와, 요구사항이 언급한 적도 없는 경우를 where((w) => w.length == 3)이 서서 지켜야 합니다.

FxDart에는 그 개념 자체를 가리키는 단어가 있습니다: windowed(3)는 정확히 완전한 윈도우들만 내놓고, partial: true가 램프다운에 대한 명시적 옵트인입니다 — 기본값이 이동 평균의 의미와 일치합니다. 라이브러리 함수 average까지 더하면(RxDart에는 집계 헬퍼가 없어 평균은 손으로 만든 reduce 후 나누기입니다), pull 쪽은 요구사항을 진술하고 push 쪽은 그것을 부호화합니다. 이 격차는 모델이 아니라 어휘입니다 — 하지만 그 어휘가 존재하는 이유는 이터러블 위의 윈도우가 pull에 자생하는 아이디어이기 때문이고, 이 판은 FxDart에게 갑니다.

벤치마크

Apple M1 Max, RAM 32 GB · Dart 3.12.2 (AOT 컴파일) · 2026-08-18

N = 100

시간 무승부

RxDart 103 µs
FxDart 63 µs

최대 메모리 무승부

RxDart 16.7 MB
FxDart 16.5 MB

N = 1,000,000

시간 FxDart 승

RxDart 1068.2 ms
FxDart 657.2 ms

최대 메모리 무승부

RxDart 154.0 MB
FxDart 150.1 MB

막대는 사이드별로 새 프로세스에서 반복 측정한 중앙값입니다(작은 N은 타이머 해상도를 위해 배치 처리). 두 사이드가 서로 5% 이내이거나 — 사람이 지각할 수 없는 차이인 0.6ms 이내이면 — 무승부로 칩니다. 상대 차이가 근소한 경우는 최대 5회까지 다시 측정합니다. 앱에서는 어느 막대가 짧든 몇 밀리초 이하의 차이는 사용자에게 보이지 않습니다. 메모리는 프로세스 최대 RSS입니다. Dart VM과 데이터셋은 양쪽이 동일하므로, 두 막대의 차이가 곧 파이프라인 자체가 붙들고 있는 양입니다.