Async Rust, 컴파일러 최적화를 통해 바이너리 크기를 줄인다!

by DD
1개월 전
조회수 4

Async Rust의 컴파일러 최적화 부재로 인해 바이너리 크기가 증가하는 문제점을 지적함

컴파일러 내부 구조를 분석하여 불필요한 상태 머신(State Machine) 제거 및 인라이닝(Inlining)을 제안함

임베디드 시스템에서 2~5%의 바이너리 크기 감소 효과를 확인, 추가적인 최적화 가능성을 제시함

커뮤니티에서는 컴파일러 최적화의 중요성에 공감하며, 관련 프로젝트 지원에 대한 논의가 이루어짐

Async Rust의 바이너리 크기 증가 문제

본문에서는 Async Rust가 임베디드 시스템(Embedded System)과 같이 메모리 제약적인 환경에서 바이너리 크기 증가의 주요 원인임을 지적한다. 특히, 컴파일러가 생성하는 불필요한 상태 머신(State Machine)인라이닝(Inlining) 부재가 문제로 제기되었다. 이러한 문제는 데스크톱 및 서버 환경에서도 존재하지만, 메모리 자원이 풍부하여 상대적으로 덜 두드러진다는 점을 강조한다. 저자는 컴파일러 최적화를 통해 이 문제를 해결하고자 한다.

컴파일러 내부 구조 분석 및 최적화 제안

저자는 컴파일러 내부 구조를 분석하여, 불필요한 패닉(Panic) 경로분기(Branch)를 제거하는 방안을 제시한다. 특히, `Future::poll` 함수가 `Ready` 상태에서 패닉하는 대신 `Pending`을 반환하도록 변경하여 바이너리 크기를 줄이는 방법을 제안했다. 또한, 인라이닝(Inlining)을 통해 함수 호출 오버헤드를 줄이고, 상태 머신(State Machine)의 복잡성을 감소시키는 방안을 제시했다. 이러한 최적화는 컴파일러의 효율성을 높이는 데 기여할 수 있다.

임베디드 시스템에서의 성능 개선

저자는 실제 컴파일러 해킹을 통해 임베디드 시스템(Embedded System)에서 2~5%의 바이너리 크기 감소 효과를 확인했다. 특히, `Returned` 상태에서 패닉을 `Pending`으로 변경하는 최적화는 2~5%의 바이너리 크기 감소를 가져왔다. 또한, `await`가 없는 async 블록에 대해 상태 머신을 생성하지 않도록 하는 최적화는 0.2%의 바이너리 크기 감소를 보였다. 이러한 결과는 성능 최적화(Performance Optimization)의 잠재력을 보여준다.

커뮤니티의 반응 및 프로젝트 지원

커뮤니티에서는 Async Rust의 컴파일러 최적화 필요성에 공감하며, 관련 프로젝트 지원에 대한 논의가 이루어졌다. 특히, 프로젝트 목표(Project Goal)를 통해 컴파일러 최적화 작업을 지원하려는 움직임이 나타났다. 댓글에서는 Rust 컴파일러가 LLVM에 과도한 코드를 생성한다는 지적이 있었으며, 이러한 문제를 해결하기 위한 노력에 대한 기대감을 나타냈다. 또한, 제로 코스트 추상화(Zero Cost Abstractions)에 대한 오해를 언급하며, 컴파일러 최적화의 중요성을 강조했다.

Async Rust never left the MVP state