주변 맥락과 함께 보는 이상치

FxDart 승

요구사항

온도 센서가 열 번의 측정값을 기록했습니다(데이터는 코드 안에 있음). 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>를 만들고, 정렬한 뒤, 두 번째 루프에서 형식을 맞춥니다 — 알고리즘은 같지만 세 개의 가변 상태 단계로 나뉘어 있습니다.

벤치마크

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

N = 100

시간 무승부

네이티브 Dart 1.6 µs
FxDart 1.5 µs

최대 메모리 무승부

네이티브 Dart 16.5 MB
FxDart 16.4 MB

N = 10,000

시간 무승부

네이티브 Dart 113 µs
FxDart 93 µs

최대 메모리 무승부

네이티브 Dart 18.3 MB
FxDart 18.7 MB

N = 1,000,000

시간 FxDart 승

네이티브 Dart 11.9 ms
FxDart 10.4 ms

최대 메모리 무승부

네이티브 Dart 132.2 MB
FxDart 131.7 MB

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