저자는 Rust에서 RaBitQ 알고리즘의 구현을 최적화하는 경험을 논의합니다. 이는 근사적인 가장 가까운 이웃 검색 알고리즘입니다. 저자는 처음에 nalgebra 라이브러리를 사용했지만 예상보다 느려졌습니다. 그러면 samply 및 Firefox Profiler와 같은 프로파일링 도구를 사용하여 코드의 병목 현상을 확인했습니다. 저자는 f32::clone() 호출이 상당한 시간을 차지하고 있음을 확인하고 벡터에 대한 메모리를 미리 할당하여 반복에서 재사용하기로 결정했습니다. 또한 저자는 GIST에 대한 QPS를 32% 개선하는 AVX2로 binarize_vector 함수를 구현했습니다. 저자는 코드에서 더 많은 f32::clone()을 제거하기 위해 스칼라 양자화도 사용했으며 일부 nalgebra 함수를 수동 구현으로 대체했습니다. 또한 저자는 SIMD로 최적화된 다른 대수 라이브러리인 faer를 찾았는데 이는 행/열 반복 성능이 더 좋습니다. 마지막으로 저자는 AVX2로 이진 점곱을 다시 구현하여 GIST에 대한 QPS를 11% 개선했습니다.
dev.to
Improve an algorithm performance step by step
