총지출 기준 상위 5개 판매자
요구사항
날짜, 판매자, 금액을 가진 한 달치 가계부 거래 내역이 주어질 때, 가장 많이 지출한 판매자 다섯 곳을 찾으세요: 판매자별로 그룹화하고, 각 그룹의 합계를 구하고, 합계를 내림차순으로 정렬한 뒤 상위 다섯 개를 출력합니다. 데이터는 아래 코드에 있으며, 두 버전 모두 예상 출력 아래에 표시된 줄들을 출력해야 합니다.
예상 출력
Green Grocer: $81.95 Electric Co: $60.34 Noodle Bar: $40.00 Cafe Aroma: $36.50 Book Nook: $27.99
나란히 보기
네이티브 Dart
FxDart
차이가 나는 이유
순수 Dart에는 그룹화 기능이 아예 없어서 네이티브 버전은
package:collection을 끌어와야 하고, 거기서 그룹화는 체인을
끊습니다: groupListsBy가 Map을 돌려주니
순위를 매기려면 중간 변수에 이름을 붙이고, .entries로 다시
들어가서, 각 그룹을 타입 정보 없는 kv.key /
kv.value 쌍으로 읽어야 하죠. 정렬에는 우회로가 두 개 더
붙습니다: 명시적인 <num> 타입 인자(double은
Comparable<num>이지
Comparable<double>이 아니라서 추론이 실패합니다),
그리고 부호를 반전한 키 — sortedBy가 오름차순만
지원하기 때문입니다.
FxDart에서는 네 단계가 하나의 체인의 네 고리가 되어, 요구사항이 말하는
순서 그대로 위에서 아래로 흘러갑니다. groupedBy는 맵 대신
(key:, items:) 그룹을 내보내며 파이프라인 안에 머물러서
풀었다가 다시 감쌀 일이 없고, sortByDesc는 "내림차순"을 빼기
기호로 인코딩하는 대신 이름으로 말합니다. 중간 변수도, 타입 인자를 챙기는
번거로움도, 부호 반전 트릭도 없습니다 — 코드가 그냥 그룹화하고, 순위를
매기고, 다섯 개를 가져오라고 말합니다.
벤치마크
N = 100
시간 무승부
최대 메모리 무승부
N = 10,000
시간 무승부
최대 메모리 무승부
N = 1,000,000
시간 FxDart 승
최대 메모리 FxDart 승
막대는 사이드별로 새 프로세스에서 반복 측정한 중앙값입니다(작은 N은 타이머 해상도를 위해 배치 처리). 두 사이드가 서로 5% 이내이거나 — 사람이 지각할 수 없는 차이인 0.6ms 이내이면 — 무승부로 칩니다. 상대 차이가 근소한 경우는 최대 5회까지 다시 측정합니다. 앱에서는 어느 막대가 짧든 몇 밀리초 이하의 차이는 사용자에게 보이지 않습니다. 메모리는 프로세스 최대 RSS입니다. Dart VM과 데이터셋은 양쪽이 동일하므로, 두 막대의 차이가 곧 파이프라인 자체가 붙들고 있는 양입니다.