전체 월간 가계부 리포트

FxDart 승

요구사항

한 달치 가계부 거래 내역(데이터는 코드에 있음)으로부터 세 구간을 가진 하나의 리포트 문자열을 만드세요: 총 지출액(수입은 제외), 지출액순으로 정렬된 카테고리별 내역, 그리고 번호가 매겨진 목록 형태의 상위 3개 판매자. 두 버전 모두 예상 출력 아래에 표시된 리포트를 정확히 출력해야 합니다.

예상 출력
July 2026 ledger
Total spent: $201.99

By category:
  Bills      $88.44
  Food       $84.40
  Fun        $15.00
  Transport  $14.15

Top merchants:
  1. Electric Co  $60.34
  2. Green Grocer $43.20
  3. Water Works  $28.10

나란히 보기

네이티브 Dart

FxDart

차이가 나는 이유

FxDart에서는 리포트의 각 구간이 같은 형태를 가집니다: groupBy → 그룹별 sumBy → 내림차순 sortBy — 그리고 takezipWithIndex가 인덱스 변수 없이도 판매자 구간을 번호 매겨진 top-3 목록으로 바꿉니다. 네이티브 버전은 이 단계들을 각각 다른 방언으로 표현해야 합니다: 합계마다 초기값을 가진 fold, 부정된 키를 쓰는 sortedBy<num>, 한 구간에는 컬렉션-for, 다른 구간에는 인덱스가 있는 for 루프. 리포트는 양쪽 모두 구간별로 자라나지만, 한쪽만 파이프라인 단계를 덧붙이며 자라고 다른 한쪽은 모양이 제각각인 중간 변수를 쌓으며 자랍니다.

벤치마크

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

N = 100

시간 무승부

네이티브 Dart 24 µs
FxDart 30 µs

최대 메모리 무승부

네이티브 Dart 16.5 MB
FxDart 16.6 MB

N = 10,000

시간 무승부

네이티브 Dart 934 µs
FxDart 442 µs

최대 메모리 FxDart 승

네이티브 Dart 23.4 MB
FxDart 17.2 MB

N = 1,000,000

시간 FxDart 승

네이티브 Dart 135.1 ms
FxDart 47.3 ms

최대 메모리 FxDart 승

네이티브 Dart 157.8 MB
FxDart 127.0 MB

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