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가
실행되기도 전에 이미 끝나 있습니다. 요소 아홉 개짜리 고정 리스트에서
그 오버헤드는 어깨 한 번 으쓱하고 넘길 만큼 작은데, 바로 그것이 이
예제와, 판정을 실어 나른 유효한 짝수 금액 합산하기의 집계
사이의 차이입니다: 여기서의 핵심은 두 라이브러리가 타입 승격까지
똑같이 합의한다는 점입니다.
벤치마크
N = 100
시간 무승부
최대 메모리 무승부
N = 1,000,000
시간 FxDart 승
최대 메모리 FxDart 승
막대는 사이드별로 새 프로세스에서 반복 측정한 중앙값입니다(작은 N은 타이머 해상도를 위해 배치 처리). 두 사이드가 서로 5% 이내이거나 — 사람이 지각할 수 없는 차이인 0.6ms 이내이면 — 무승부로 칩니다. 상대 차이가 근소한 경우는 최대 5회까지 다시 측정합니다. 앱에서는 어느 막대가 짧든 몇 밀리초 이하의 차이는 사용자에게 보이지 않습니다. 메모리는 프로세스 최대 RSS입니다. Dart VM과 데이터셋은 양쪽이 동일하므로, 두 막대의 차이가 곧 파이프라인 자체가 붙들고 있는 양입니다.