null은 버리고 값만 남기기

우열 없음

요구사항

배터리 모니터가 전압 샘플 아홉 개를 만들었는데, 그중 세 개는 센서가 놓쳤습니다(null). 실패를 버리고, 살아남은 각 샘플을 소수점 한 자리로 포맷해 출력한 뒤, 몇 개가 버려졌는지 보고하세요. 데이터는 아래 코드에 있으며, 두 버전 모두 예상 출력 아래에 표시된 줄들을 출력해야 합니다.

예상 출력
3.4 V
3.9 V
4.1 V
3.7 V
4.4 V
4.0 V
Dropped 3 empty samples

나란히 보기

RxDart

FxDart

차이가 나는 이유

whereNotNull compact입니다 — 같은 연산자가 각 라이브러리의 명명 규칙을 입고 있을 뿐입니다. 둘 다 필터링 너머의 중요한 일을 합니다: 정적 타입을 좁혀서 double? 요소 타입을 double로 바꿉니다. 덕분에 하류의 toStringAsFixed 호출에는 null 체크도 !도 필요 없습니다. 필터와 타입 승격을 한 단어로, 양쪽 모두에서 해냅니다.

그러니 어휘에 관한 판정은 무승부이고 — 정직하게 남는 것은 전달 모델뿐입니다. 스트림 버전은 이미 들고 있는 리스트를 Stream으로 끌어올렸다가 수집 결과를 다시 await로 받아냅니다; pull 버전은 스트림 버전의 첫 await가 실행되기도 전에 이미 끝나 있습니다. 요소 아홉 개짜리 고정 리스트에서 그 오버헤드는 어깨 한 번 으쓱하고 넘길 만큼 작은데, 바로 그것이 이 예제와, 판정을 실어 나른 유효한 짝수 금액 합산하기의 집계 사이의 차이입니다: 여기서의 핵심은 두 라이브러리가 타입 승격까지 똑같이 합의한다는 점입니다.

벤치마크

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

N = 100

시간 무승부

RxDart 24 µs
FxDart 11 µs

최대 메모리 무승부

RxDart 16.5 MB
FxDart 16.5 MB

N = 1,000,000

시간 FxDart 승

RxDart 208.6 ms
FxDart 126.3 ms

최대 메모리 FxDart 승

RxDart 123.0 MB
FxDart 116.8 MB

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