Roc로 쓴 DEFLATE, libdeflate보다 중앙값 2.6% 느린 수준까지 따라잡음
- Richard Feldman이 Niclas Ahden의 roc-deflate를 최적화해 Silesia 코퍼스 144개 벤치마크에서 libdeflate 대비 중앙값 M1 맥북 2.6%, 라이젠 3900X 8.9% 느린 수준까지 좁힘
- Roc는 첫 정식 릴리스인 0.1.0도 아직 나오지 않았고 패키지 생태계에 최적화 작업이 거의 없는데도 이 정도 성능이 나온 것
- 비교 상대인 libdeflate는 아키텍처별 SIMD를 쓰는 C 구현으로, Lean 4의 lean-zip이 miniz_oxide는 앞섰어도 libdeflate는 넘지 못한 것과 같은 상대
- roc-deflate에 스트리밍 API가 아직 없어 비스트리밍 API만 비교했고, 모든 벤치마크는 15회 중앙값으로 재고 출력이 동일한지 검증함
- 출발점은 Lean 4로 쓴 lean-zip이 crates.io 다운로드 10억 회가 넘는 miniz_oxide보다 최고 속도 설정에서 15% 빠르고 출력은 8.8% 작다고 보고한 글이었음
Hacker News opinions
Feldman 글은 그냥 믿고 본다. 이게 opportunistic mutation 사례인지는 전문가들이 판단해줬으면 좋겠음
성능 차이의 상당 부분은 C/C++이 아주 과감한 copy elision을 허용한다는 데서 나옴. 메모리 대역폭이 병목인 경우가 많아서 이게 큰데, C/C++은 멀리 떨어진 상태를 직접 건드려 고칠 수 있고 컴파일러는 접근 방식이 얼마나 지저분하든 별말 안 함. 대신 불변식은 프로그래머가 책임져야 하고 유지보수성과 안전성 비용이 붙지. 함수형 언어가 이론상 병렬성은 좋아도 슈퍼컴퓨팅에서는 평범한 이유가 이거임
설명 잘 봤음. 소프트웨어와 하드웨어 간극을 메우는 이런 접근 패턴을 다루는 자료가 따로 있나? 내가 아는 건 Denis Bakhvalov의 Performance Analysis and Tuning on Modern CPUs 정도임
근데 libdeflate가 정말 빠른 게 맞나 싶음. 내 인상으로는 zstd랑 비슷한 출력 크기를 내면서 40배는 오래 걸리는데, 알고리즘이 다르다 해도 둘 다 LZ 계열 허프만이라 그렇게 다르지도 않고. 왜 libdeflate가 성능 기준으로 쓰이는 거지
아마 zstd 구현을 Lean으로 하는 게 더 어려워서일 거임. 그 프로젝트는 구현에 대한 정확성 증명이 가능해야 돌아가는데, DEFLATE 쪽이 그 증명을 붙이기 단순하지
Roc로 만든 유명한 프로그램이 뭐가 있나 궁금하고 문법 난이도도 알고 싶음
0.1.0도 안 나온 초기 개발 단계라 그런 건 아직 없음. 그래도 재미있는 성질이 있어서 한번 실험해보는 건 추천함