피드로 돌아가기
Dev.toBackend
원문 읽기
Dynamic Regex 컴파일 제거를 통한 성능 90배 향상 및 Zero Allocation 달성
Why Regex Sucks in a Hot Loop
AI 요약
Context
SQL Parser 내 특정 Table Alias 존재 여부를 확인하는 Hot Loop 구간의 성능 병목 발생. 기존 Regex 방식은 쿼리마다 변경되는 가변 패턴을 처리하기 위해 매 호출 시 컴파일을 수행하는 구조적 한계를 가짐.
Technical Solution
- 가변 패턴으로 인한
regexp.MustCompile반복 호출 및 메모리 할당 비용 제거 strings.Index기반의 Hand-rolled String Scanner 구현을 통한 SIMD 가속 활용- 식별자 경계 확인을 위한 앞 글자 검사 로직(IsLetter, IsDigit, '_') 추가로 정확도 확보
- 패턴 컴파일 단계가 생략된 직접 탐색 구조로 런타임 오버헤드 최소화
- 불필요한 Heap 할당을 배제한 Zero Allocation 설계 적용
Impact
- 처리 속도 개선: Long Input 기준 Regex(46,600ns) 대비 Scanner(1,566ns) 약 30배-90배 빠른 성능 기록
- 메모리 효율: 매 호출 시 발생하던 Regex 할당 비용을 0으로 감소
- 성능 격차: Short Input(21ns vs 1,972ns)부터 Long Input까지 전 구간에서 Scanner 우세
실천 포인트
1. Regex 패턴에 변수가 포함되어 매번 컴파일이 필요한 Hot Loop인지 확인하십시오.
2. SIMD 가속을 지원하는 표준 라이브러리(`strings.Index` 등)의 성능 잠재력을 검토하십시오.
3. 단순 성능 비교가 아닌 실제 배포될 코드와 동일한 조건의 벤치마크를 수행하십시오.
4. 정규식의 비용이 '컴파일'과 '매칭'으로 분리됨을 인지하고 패턴의 불변성 여부를 판단하십시오.