판독값 3개 이동 평균
요구사항
시간별 온도 판독값 여덟 개를 판독값 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에게 갑니다.
벤치마크
N = 100
시간 무승부
최대 메모리 무승부
N = 1,000,000
시간 FxDart 승
최대 메모리 무승부
막대는 사이드별로 새 프로세스에서 반복 측정한 중앙값입니다(작은 N은 타이머 해상도를 위해 배치 처리). 두 사이드가 서로 5% 이내이거나 — 사람이 지각할 수 없는 차이인 0.6ms 이내이면 — 무승부로 칩니다. 상대 차이가 근소한 경우는 최대 5회까지 다시 측정합니다. 앱에서는 어느 막대가 짧든 몇 밀리초 이하의 차이는 사용자에게 보이지 않습니다. 메모리는 프로세스 최대 RSS입니다. Dart VM과 데이터셋은 양쪽이 동일하므로, 두 막대의 차이가 곧 파이프라인 자체가 붙들고 있는 양입니다.