서비스와 심각도별 로그 알림 다이제스트

FxDart 승

요구사항

서비스 로그 스트림(데이터는 코드 안에 있음)에서 WARNERROR 줄만 남겨 들여쓰기된 다이제스트로 표현하세요: 서비스는 알림 개수로 정렬하고, 각 서비스 아래에는 심각도와 그 개수를, 각 심각도 아래에는 서로 다른 메시지를 나열합니다. 헤더 줄에는 전체 ERROR/WARN 합계가 표시됩니다. 두 버전 모두 예상 출력 아래에 표시된 다이제스트를 출력해야 합니다.

예상 출력
Alert digest — ERROR 4, WARN 5
api (4)
  ERROR x2
    - timeout calling billing
  WARN x2
    - slow query 1.2s
    - disk 85% full
auth (3)
  ERROR x1
    - bad signature
  WARN x2
    - token near expiry
billing (2)
  ERROR x1
    - invoice 442 failed
  WARN x1
    - retrying charge

나란히 보기

네이티브 Dart

FxDart

차이가 나는 이유

들여쓰기된 다이제스트는 트리를 줄 단위로 평탄화한 것이며, flatMap은 정확히 그 평탄화 작업입니다: 바깥쪽의 groupBy + sortBy + flatMap이 서비스마다 헤더와 그 하위 항목을 내보내고, 안쪽의 flatMap이 심각도마다 같은 일을 하며, uniq가 중복되는 메시지를 그때그때 처리합니다. countBy는 헤더의 합계를 한 단어로 구해줍니다. 네이티브 버전은 공유 body 리스트에 써넣는 세 겹의 중첩 for 루프에, 직접 작성한 카운팅 맵과 중복 제거용 seen 집합까지 더해집니다 — 트리 구조는 두 버전 모두에 실제로 존재하지만, 그것을 코드의 들여쓰기만으로 읽어낼 수 있는 쪽은 하나뿐입니다.

벤치마크

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

N = 100

시간 무승부

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

최대 메모리 무승부

네이티브 Dart 16.5 MB
FxDart 16.5 MB

N = 10,000

시간 무승부

네이티브 Dart 1.46 ms
FxDart 1.39 ms

최대 메모리 무승부

네이티브 Dart 17.9 MB
FxDart 18.1 MB

N = 1,000,000

시간 무승부

네이티브 Dart 174.1 ms
FxDart 174.4 ms

최대 메모리 네이티브 승

네이티브 Dart 213.2 MB
FxDart 239.8 MB

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