프로그래밍
4시간 전
0
Rust의 제로코스트 추상화가 실제로는 SIMD 벡터화와 루프 언롤링을 막아 성능 저하를 유발한다는 점을 분석하였습니다.
turbopuffer의 대규모 BM25 필터 쿼리에서, 재귀적 호출 기반의 Rust 이터레이터가 병렬 처리 최적화를 방해해 쿼리 지연 시간이 220ms에서 47ms로 개선된 사례를 소개합니다.
이를 해결하기 위해, 전통적인 데이터베이스 기법인 **배치 이터레이터(batched iterators)**를 도입하여 재귀 호출 대신 한 번에 여러 값을 처리하도록 구조를 변경함으로써, 컴파일러가 SIMD 명령어를 활용해 병렬 처리를 가능하게 하였습니다.
이로 인해 CPU가 효율적으로 데이터를 처리할 수 있게 되어, 실제 실행 속도가 60배 이상 빨라졌으며, 이는 추상화가 항상 최적의 성능을 보장하지 않음을 시사합니다.
결론적으로, Rust의 제로코스트 추상화가 코드 단위에서는 비용이 없지만, 호출 간 경계가 SIMD 최적화를 막는 숨겨진 비용이 존재하므로, 하드웨어 친화적인 최적화와 기계적 공감(mechanical sympathy)이 필수적임을 강조합니다.