피드로 돌아가기
자바스크립트 이렇게 짜면 외않되?
올리브영 테크블로그올리브영 테크블로그
Frontend

자바스크립트 이렇게 짜면 외않되?

V8 엔진의 JIT 컴파일러와 히든클래스 최적화 원리를 이해한 자바스크립트 코드 작성으로 반복 호출 시나리오에서 약 2배 성능 향상

2023년 10월 28일12intermediate

Context

자바스크립트 개발자들은 코드가 V8 엔진에서 어떻게 최적화되는지 이해하지 못한 채 작성하고 있으며, 동일한 객체 구조를 다르게 초기화하면 성능에 큰 영향을 미친다.

Technical Solution

  • JIT 컴파일러 동작 방식 이해: 인터프리터로 초기 실행 후 반복되는 코드를 터보팬으로 기계어 컴파일
  • 인라인 캐싱 활용: 함수 호출 시 파라미터로 전달되는 객체의 타입을 캐시하여 메모리 주소를 직접 참조해 속성 검색 과정 생략
  • 히든클래스 최소화: 객체 속성을 항상 같은 순서로 초기화하여 인스턴스들이 동일한 히든클래스 참조 및 오프셋 공유
  • 오프셋 기반 메모리 참조: user.lastname 같은 속성 접근 시 실제 메모리 주소를 오프셋으로 저장하여 런타임 검색 제거
  • 메소드 호출 패턴 최적화: 서로 다른 메소드를 한 번씩 호출하는 것보다 동일한 메소드를 반복 호출하도록 코드 구성

Impact

  • 객체 구조를 통일하지 않은 코드 대비 5억 번의 반복 호출에서 약 2배 성능 차이 관측

Key Takeaway

자바스크립트에서 객체 속성을 일관된 순서로 정의하고 히든클래스를 최소화하는 것이 JIT 최적화를 최대한 활용하는 핵심 설계 원칙이다.


프론트엔드 애플리케이션에서 반복적으로 접근하는 객체(사용자 정보, API 응답 등)를 다룰 때, 같은 생성자 함수 내에서 모든 속성을 동일한 순서로 초기화하고 생성 후 속성 추가/삭제를 피하면 V8 엔진의 인라인 캐싱과 히든클래스 최적화가 작동하여 반복 처리 성능을 약 2배 향상시킬 수 있다.

원문 읽기