총지출 기준 상위 5개 판매자

FxDart 승

요구사항

날짜, 판매자, 금액을 가진 한 달치 가계부 거래 내역이 주어질 때, 가장 많이 지출한 판매자 다섯 곳을 찾으세요: 판매자별로 그룹화하고, 각 그룹의 합계를 구하고, 합계를 내림차순으로 정렬한 뒤 상위 다섯 개를 출력합니다. 데이터는 아래 코드에 있으며, 두 버전 모두 예상 출력 아래에 표시된 줄들을 출력해야 합니다.

예상 출력
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을 끌어와야 하고, 거기서 그룹화는 체인을 끊습니다: groupListsByMap을 돌려주니 순위를 매기려면 중간 변수에 이름을 붙이고, .entries로 다시 들어가서, 각 그룹을 타입 정보 없는 kv.key / kv.value 쌍으로 읽어야 하죠. 정렬에는 우회로가 두 개 더 붙습니다: 명시적인 <num> 타입 인자(doubleComparable<num>이지 Comparable<double>이 아니라서 추론이 실패합니다), 그리고 부호를 반전한 키 — sortedBy가 오름차순만 지원하기 때문입니다.

FxDart에서는 네 단계가 하나의 체인의 네 고리가 되어, 요구사항이 말하는 순서 그대로 위에서 아래로 흘러갑니다. groupedBy는 맵 대신 (key:, items:) 그룹을 내보내며 파이프라인 안에 머물러서 풀었다가 다시 감쌀 일이 없고, sortByDesc는 "내림차순"을 빼기 기호로 인코딩하는 대신 이름으로 말합니다. 중간 변수도, 타입 인자를 챙기는 번거로움도, 부호 반전 트릭도 없습니다 — 코드가 그냥 그룹화하고, 순위를 매기고, 다섯 개를 가져오라고 말합니다.

벤치마크

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

N = 100

시간 무승부

네이티브 Dart 25 µs
FxDart 138 µs

최대 메모리 무승부

네이티브 Dart 17.0 MB
FxDart 17.1 MB

N = 10,000

시간 무승부

네이티브 Dart 712 µs
FxDart 588 µs

최대 메모리 무승부

네이티브 Dart 22.9 MB
FxDart 23.7 MB

N = 1,000,000

시간 FxDart 승

네이티브 Dart 116.8 ms
FxDart 63.4 ms

최대 메모리 FxDart 승

네이티브 Dart 137.3 MB
FxDart 117.8 MB

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