- V8 엔진에서 JSON.stringify 함수의 성능을 두 배 이상 높여, 데이터 직렬화 속도 개선 효과를 얻음
- 부작용 없는 객체를 위한 최적화 경로를 도입해 다수의 방어적인 검사 로직을 생략함으로써 일반적인 데이터 객체에서 큰 속도 향상을 이룸
- 문자열 처리 시 1바이트/2바이트 구분, SIMD 활용, 임시 버퍼 구조 변경 등 하드웨어와 메모리 측면 전반에서 고도화된 방법을 적용
- 숫자 변환 과정에서는 기존 Grisu3 알고리듬을 Dragonbox로 교체하여 Number.toString() 호출 전반에서도 신속한 변환 가능성 확보
- 일부 인자·형태에서는 일반 직렬화 경로로 돌아가지만, 대부분 웹 개발 상황에서는 자동으로 최적화 효과를 누릴 수 있음
개요
JSON.stringify는 자바스크립트에서 데이터를 문자열로 변환하는 핵심 함수- 이 함수의 성능 향상은 네트워크 요청이나 localStorage 저장 등 웹에서 매우 중요한 작업들에도 긍정적 영향을 줌
- 최신 V8 엔지니어링을 통해 이 기능의 속도가 두 배 이상 개선되었으며, 주요 최적화 방안을 상세히 소개함
부작용 없는 Fast Path 경로
- 최적화의 핵심은 부작용(side-effect)이 없는 상황에서만 사용할 수 있는 빠른 직렬화 경로 적용
- 이런 상황에서는 재귀가 아니라 반복적(iterative) 구조로 객체 순회함으로써, 스택 오버플로우 검사가 필요 없고, 더 깊은 객체 직렬화 시도도 가능함
- 데이터 객체가 단순할 때 V8은 느린 일반 로직 대신 이 Fast Path를 활용해 많은 검사를 생략하고 속도를 올림
다양한 문자열 표현 처리
- V8은 1바이트/2바이트 문자(ASCII/비-ASCII) 에 따라 문자열을 다르게 저장하며, 하나라도 비-ASCII가 있으면 전체가 2바이트로 관리됨
- 문자열 직렬화 성능을 위해 문자열 타입별로 별도의 알고리듬 버전을 만들어 컴파일함
- 처리 중에 문자열 인스턴스 타입을 확인해야 하므로, 2바이트 문자열이 감지되면 적합한 2바이트 직렬화기가 상태를 넘겨받음
- 덕분에 문자열 인코딩별 경로 전환 부하는 사실상 없음
- 결과는 1바이트, 2바이트 버퍼를 각각 만든 뒤 마지막에 단순히 병합함
SIMD로 문자열 직렬화 최적화
- 자바스크립트 문자열에는 JSON 직렬화 시 이스케이프가 필요한 문자가 포함될 수 있음
- 긴 문자열은 SIMD 하드웨어 명령(ARM64 Neon 등)으로 여러 바이트를 한 번에 검사함
- 짧은 문자열은 SWAR 방식으로, 범용 레지스터에서 비트 연산을 통해 여러 문자를 동시에 처리함
- 어떤 방식이든, 대부분의 경우 별다른 변환 없이 전체 문자열을 빠르게 복사 가능함
Express Lane(초고속 경로) 추가
- Fast Path 내에서도 프로퍼티 검사 등 반복적인 작업 없이 키 복사만으로 직렬화가 가능하도록 Express Lane 마련함
- 오브젝트의 hidden class 플래그를 활용해 키에 Symbol이 없고, 모두 enumerable 및 이스케이프 필요 없이 직렬화된 경우 'fast-json-iterable'로 마킹함
- 동일한 hidden class를 갖는 다른 객체 직렬화 시 별도 검사 없이 바로 키 복사 수행
- 이 기법은
JSON.parse에서도 빠른 키 비교에 응용
더 빠른 double-to-string 알고리듬
- 숫자를 문자열로 변환하는 과정도 높은 빈도와 복잡성을 가짐
- 기존 Grisu3 알고리듬을 Dragonbox로 교체해,
Number.prototype.toString()전체 호출에서도 성능향상 효과가 발생함
임시 버퍼 구조 최적화
- 문자열 빌드 시 기존에는 단일 연속 버퍼를 사용해, 공간이 부족할 때마다 전체 복사 작업이 발생하는 과부하가 있었음
- 새로운 방법은 분할(segmented) 버퍼 구조로, 여러 소규모 버퍼를 필요에 따라 이어붙임
- 덕분에 공간 부족 시 전체 복사 필요 없이 새로운 버퍼 할당만 진행됨
한계
- Fast Path는 단순한 데이터 직렬화에 한해 동작함
- 아래 조건에 부합하지 않을 경우 일반 경로 사용
- replacer 혹은 space 인자 사용 불가(Pretty-Print, 변형 불가)
- toJSON 커스텀 메서드 없는 단순 객체여야 함
- 인덱스 기반 프로퍼티가 있으면 느린 경로로 이동
- ConsString 등 특수 문자열은 처리하지 않음
- 대부분 데이터 직렬화, API 응답 생성, 설정 캐싱 등 일반적인 용도엔 자동으로 최적화 효과가 적용됨
결론
JSON.stringify의 기본 설계부터 메모리 처리, 문자 처리까지 전 영역에서 접근 방식을 재구성하여 JetStream2 벤치마크 기준 2배 이상의 속도 상승을 달성함- 해당 개선사항은 V8 버전 13.8(Chrome 138) 이상에서 바로 경험 가능함