Rust arena로 Gleam의 3년 묵은 성능 이슈 해결하기
요약
이 글은 Rust에서 아레나(Arena) 패턴을 활용하여 성능 문제를 해결하는 방법을 제시합니다. 특히 참조를 반환하는 방식을 사용하면, 복잡한 구조적 재귀와 패턴 매칭 시 발생하는 포인터 및 박스 관련 제약 사항을 우회할 수 있어 매우 편리합니다. 이를 통해 메모리 효율성과 코드의 간결성을 동시에 확보할 수 있습니다.
핵심 포인트
- 아레나를 활용하여 참조를 반환하면 Rust에서 구조적 재귀 패턴 매칭이 용이해집니다.
- 불투명 핸들(Opaque Handles)을 사용하면 메모리 사용량을 줄이고 할당 효율을 높일 수 있습니다.
- 전통적인 포인터/박스 방식의 제약 없이 일관된 생명주기 관리가 가능합니다.
최고 메모리 사용량을 10% 더 줄이고 싶다면 참조 대신 불투명 핸들을 반환하는 다른 아레나를 고려할 만함. 핸들을 64비트 대신 16비트나 32비트로 만들 수 있어 작은 할당이 많을 때 효과가 큼 https://donsz.nl/blog/arenas/ 에 따르면 이를 지원하는 크레이트는 compact_arena뿐이지만, 요구에 맞지 않으면 직접 구현하기도 어렵지 않음
불투명 핸들을 쓰면 데이터를 더 조밀하게 저장할 수도 있음. 개인 프로젝트인 columnar는 Option<T> 목록을 항목당 1비트 남짓의 존재 여부와 실제로 존재하는 항목의 T로 나눠 저장함
대신 참조형으로 &Option<T>가 아니라 Option<&T>를 반환하며, 더 일반적으로는 구조적 재귀 안에 참조를 두기보다 참조를 따라 구조적으로 재귀하는 방식임
해당 글은 2년 전 조사를 바탕으로 했고 모든 크레이트를 완벽히 다루지는 못했으니, 오류나 빠진 새 라이브러리를 발견하면 PR을 보내주면 됨
아레나는 더 널리 쓰일 가치가 있으며, 핸들이나 스마트 포인터 대신 참조를 반환하면 Rust에서 재귀 열거형 패턴 매칭이 매우 편해짐. 보통 if let MyAst::Add(MyAst::Multiply(a, b), c) = expr {}처럼 쓰려 해도 중간의 박스나 포인터 때문에 불가능하지만, 참조는 nightly 기능 없이 투명하게 패턴 매칭할 수 있음. 모든 참조가 한 아레나를 가리키면 트리 전체를 연결하는 수명도 일관되게 유지됨
결과가 좋아서 컴파일러의 다른 부분도 아레나 방식으로 전환하는 방안을 고려 중이며, 이 접근을 계속 살펴볼 예정임
이 방식은 또 다른 Wadler 방식의 예쁜 출력 라이브러리인 pretty가 지원하는 접근과 꽤 비슷함. 다만 여러 메모리 할당 방식을 지원하다 보니 API가 다소 부담스럽게 느껴질 수 있음
AI 자동 생성 콘텐츠
본 콘텐츠는 GeekNews의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기