피드로 돌아가기
Cx Dev Log — 2026-05-25
Dev.toDev.to
Backend

BindingId 도입을 통한 인터프리터 변수 조회 성능 56.8% 향상

Cx Dev Log — 2026-05-25

COMMENTERTHE92026년 6월 9일3advanced

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와 인터프리터처럼 구현 수준이 다른 컴포넌트 간 기능 격차 발생 시, 사이드카 패턴을 통한 명시적 예외 처리 적용

원문 읽기