피드로 돌아가기
Dev.toBackend
원문 읽기
BindingId 도입을 통한 인터프리터 변수 조회 성능 56.8% 향상
Cx Dev Log — 2026-05-25
AI 요약
Context
인터프리터가 변수 접근 시마다 매번 변수명을 String Hashing 하는 구조로 인해 CPU 사이클 낭비 발생. 특히 산술 루프와 같은 반복 연산에서 런타임 오버헤드가 성능 병목 지점으로 작용함.
Technical Solution
- Runtime String Hashing 제거를 위해 Semantic Phase에서 미리 할당한 숫자 기반 BindingId 도입
- ScopeFrame.vars 구조를 u32 BindingId 기반의 Zero-cost Identity Hasher를 탑재한 HashMap으로 변경
- ConstDecl 및 semantic_impls가 BindingId를 유지하도록 수정하여 Semantic Phase와 인터프리터 간 파이프라인 일관성 확보
- RuntimeError::IndexOutOfBounds 변형 도입을 통한 Array Bounds Error 진단 정밀도 개선
- Builtin Registry를 단일 소스(src/frontend/builtins.rs)로 통합하여 구조적 발산 및 리스트 드리프트 방지
- .jit_known_unsound 사이드카 메커니즘을 활용하여 인터프리터의 개선 사항과 JIT의 기술적 제약을 분리 설계
Impact
- arith_loop(5M iterations): 5744ms → 2481ms (56.8% 개선)
- nested_loops(4M iterations): 2675ms → 1796ms (32.8% 개선)
- fib_recursive: 6835ms → 6488ms (5.1% 개선)
Key Takeaway
런타임의 빈번한 문자열 연산을 정수 ID 기반의 직접 참조로 대체함으로써 JIT 수준의 변수 처리 효율성에 근접 가능하며, 성능 최적화 시 Call-frame 설정 비용과 Variable Lookup 비용을 분리하여 분석하는 접근법이 유효함.
실천 포인트
- Hot-path 내 String Key 기반 HashMap 사용 시, 정수 기반 Identity Hash로 대체 가능한지 검토 - 컴파일/분석 단계(Semantic Phase)의 결과물을 런타임 키로 재활용하여 중복 연산 제거 - JIT와 인터프리터처럼 구현 수준이 다른 컴포넌트 간 기능 격차 발생 시, 사이드카 패턴을 통한 명시적 예외 처리 적용