LZ4보다 2배 빠른 디코딩과 더 나은 압축률을 내세운 신규 코덱 misa77 공개
- 개발자가 만든 신규 무손실 코덱 misa77은 텍스트형(byte-aligned) 데이터에서 LZ4보다 디코딩 속도가 약 2배 빠르면서 압축률도 더 좋다고 소개됨
- misa77은 매치 길이를 블록당 32로 제한하고, 매치 거리에 최소 상수 제약을 걸고, 토큰과 리터럴을 별도 스트림으로 분리하는 등 LZ4 포맷을 변형해 디코더의 분기(branch)를 최소화하고 out-of-order 코어에 친화적으로 만든 것이 핵심 아이디어임
- 게임 에셋(유니티 lz4hc 압축) 테스트에서는 misa77 레벨0가 WoTR 맵 에셋 기준 4061 MB/s로 lz4의 2561 MB/s보다 빠르지만 압축률은 61.52%로 lz4의 62.66%보다 약간 낮게 나옴
- 제작자는 안전하지 않은 UB 기반 디코더 대신 safe 버전을 v0.3.0에 추가할 계획이며, safe 버전은 기존보다 약 5%만 느리다고 밝힘
- 현재 포맷은 v0.x.y로 아직 불안정하고 로컬 퍼징만 거쳤을 뿐 hardened되지 않아 실제 프로덕션 사용에는 위험하다는 지적이 나옴
Hacker News opinions
나는 게임 엔진에서 맵 디코딩 속도 때문에 이거 관심 있음, 오늘 오후에 써볼 예정
(제작자) 게임 에셋은 대부분 float라서 텍스트 데이터보다 이득이 적더라, WoTR 맵 에셋 기준으로 misa77 레벨0가 4061 MB/s인데 lz4는 2561 MB/s, 대신 압축률은 lz4가 조금 더 좋음
Weissman score가 뭔지 알려줘라 (드라마 실리콘밸리 개그임)
오지 압축이랑 비교해보면 재밌을 듯, 아마 Selkie가 제일 비슷한 알고리즘 아닐까
이거 안전하지 않은 입력에 대해 robust하지 않으면 사실 다른 클래스의 알고리즘인데, 그리고 최신 CPU에서 lz4가 2505 MB/s면 좀 느린 거 아님?
(제작자) safe 버전 만들어도 5%밖에 안 느려짐, v0.3.0에 추가할 예정. 그리고 그 수치는 터보부스트 끄고 2.1GHz 고정한 값이라 낮게 나온 거고 상대 성능은 터보 켜도 비슷함
압축률도 더 좋으면서 디코딩 속도가 거의 두 배라니 대단한데, README에 실제로 어떻게 통합하는지 코드 예시가 없어서 아쉬움. 기본 코드 샘플 추가하면 좋을 듯
고압축 가능한 파일에서 디코딩 처리량이 특히 높다는 건 당연한 거 아님? RLE 같은 방식도 원래 그런 특성 있잖아
README 보면 포맷이 v0.x.y라서 언제든 바뀔 수 있고, 잘못된 입력은 UB이고 보장 안 한다고 써있음, 로컬 퍼징만 했지 hardened는 아니라고도 써있음
이 세 가지(포맷 불안정, 입력 신뢰, 미검증)는 실제 사용에는 다 걸림돌임, 안정 안 된 포맷이 입력을 신뢰하면 그건 그냥 CVE에 데이터 손실 폭탄임
AArch64에서는 lz4보다 느리던데?
근거 있음? 테스트 환경이랑 코퍼스가 뭐였는지 알려줄 수 있음?
왜 이렇게 빠른지 접근 방식이 뭔지 README에 안 나와있어서 궁금함, 압축 속도 느려지는 트레이드오프는 있는데 그 아이디어가 뭐였는지
(제작자) 한마디로 'LZ4를 풀어놓은 버전'임, 브랜치 제거하고 예측 가능하게 만들고 OoO 코어에 친화적으로 가짜 데이터 의존성을 드물게 타는 분기 뒤에 숨김, 매치 길이는 블록당 32로 제한, 거리는 고정 상수 이상, 토큰/리터럴 스트림 분리, 토큰 바이트 포맷도 바꿈, 압축기는 분기 유발 '코스트'를 선형함수로 정의해서 DP로 최소화함
이거 부트 펌웨어용으로 딱인데, 디코더 코드 크기가 얼마나 됨?
이건 잘 알려진 트레이드오프임, memcpy 친화적으로 포맷을 스트림라인하면 고압축 데이터에서는 lz4나 snappy가 더 빠를 수 있음. 대신 인코딩이 느려지는 값을 치러야 함. Google에서 snappy 압축 담당하는데, clang으로 컴파일하면 snappy 결과 더 좋아지고 aarch64는 shrn 명령어로 movemask 최적화 가능함
(제작자) ARM 전용 디스패치나 NEON 경로는 아직 없고 컴파일러 자동 벡터화만 믿고 있음, 다음 버전에서 추가할 예정