주변 맥락과 함께 보는 이상치
요구사항
온도 센서가 열 번의 측정값을 기록했습니다(데이터는 코드 안에 있음).
80.0 C를 초과하는 측정값마다 !
표시를 붙여, 바로 앞뒤 측정값과 함께 — grep -C1이
맥락 줄을 보여주는 방식대로 — 출력하세요. 맥락 범위가 겹치는 경우 각
측정값은 한 번만 나타나야 합니다. 마지막에는 최고 측정값을 출력합니다.
두 버전 모두 예상 출력 아래에 표시된 블록을 출력해야 합니다.
예상 출력
Readings above 80.0 C, with context 09:05 64.8 C ! 09:10 91.2 C 09:15 66.0 C 09:20 67.4 C ! 09:25 84.9 C ! 09:30 88.3 C 09:35 70.2 C Peak: 91.2 C at 09:10
나란히 보기
네이티브 Dart
FxDart
차이가 나는 이유
"적중할 때마다 윈도우로 확장하고, 겹치는 윈도우는 병합한다"는
평탄화-후-중복제거 문제이며, FxDart는 그 표현 그대로 풀어냅니다:
zipWithIndex가 위치를 유지하고, filter가
이상치를 찾고, flatMap이 각 이상치를
[i-1, i, i+1]로 확장하며, uniq가 겹치는
부분을 병합합니다 — 측정값에서 출력 줄까지 끊김 없는 하나의
표현식입니다. 네이티브 Dart에는 이런 용도의
flatMap-투-uniq 관용구가 없으므로, 자연스러운
버전은 중첩 for 루프 안에서 인덱스의
Set<int>를 만들고, 정렬한 뒤, 두 번째 루프에서
형식을 맞춥니다 — 알고리즘은 같지만 세 개의 가변 상태 단계로
나뉘어 있습니다.
벤치마크
N = 100
시간 무승부
최대 메모리 무승부
N = 10,000
시간 무승부
최대 메모리 무승부
N = 1,000,000
시간 FxDart 승
최대 메모리 무승부
막대는 사이드별로 새 프로세스에서 반복 측정한 중앙값입니다(작은 N은 타이머 해상도를 위해 배치 처리). 두 사이드가 서로 5% 이내이거나 — 사람이 지각할 수 없는 차이인 0.6ms 이내이면 — 무승부로 칩니다. 상대 차이가 근소한 경우는 최대 5회까지 다시 측정합니다. 앱에서는 어느 막대가 짧든 몇 밀리초 이하의 차이는 사용자에게 보이지 않습니다. 메모리는 프로세스 최대 RSS입니다. Dart VM과 데이터셋은 양쪽이 동일하므로, 두 막대의 차이가 곧 파이프라인 자체가 붙들고 있는 양입니다.