서비스와 심각도별 로그 알림 다이제스트
요구사항
서비스 로그 스트림(데이터는 코드 안에 있음)에서 WARN과
ERROR 줄만 남겨 들여쓰기된 다이제스트로 표현하세요: 서비스는
알림 개수로 정렬하고, 각 서비스 아래에는 심각도와 그 개수를, 각 심각도
아래에는 서로 다른 메시지를 나열합니다. 헤더 줄에는 전체
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 집합까지 더해집니다 — 트리 구조는 두 버전 모두에
실제로 존재하지만, 그것을 코드의 들여쓰기만으로 읽어낼 수 있는 쪽은
하나뿐입니다.
벤치마크
N = 100
시간 무승부
최대 메모리 무승부
N = 10,000
시간 무승부
최대 메모리 무승부
N = 1,000,000
시간 무승부
최대 메모리 네이티브 승
막대는 사이드별로 새 프로세스에서 반복 측정한 중앙값입니다(작은 N은 타이머 해상도를 위해 배치 처리). 두 사이드가 서로 5% 이내이거나 — 사람이 지각할 수 없는 차이인 0.6ms 이내이면 — 무승부로 칩니다. 상대 차이가 근소한 경우는 최대 5회까지 다시 측정합니다. 앱에서는 어느 막대가 짧든 몇 밀리초 이하의 차이는 사용자에게 보이지 않습니다. 메모리는 프로세스 최대 RSS입니다. Dart VM과 데이터셋은 양쪽이 동일하므로, 두 막대의 차이가 곧 파이프라인 자체가 붙들고 있는 양입니다.