핵심 요약
- Go 1.27에 기본 탑재되는 신규 JSON 패키지(encoding/json/v2)의 실제 성능을 벤치마크한 테스트 결과가 공개되었습니다.
- 임의 형태(any)의 역직렬화 및 직렬화는 구형 대비 1.5~3배 빨라졌으나, 타입이 지정된 구조체의 직렬화는 오히려 1.5배 더 느려지는 반전이 확인되었습니다.
- 단순 버전 업그레이드만으로도 일부 마샬링 성능 개선이 있지만, 고정 스키마 사용 패턴에 따라 성능 저하가 발생할 수 있어 주의가 요구됩니다.
요약 Go 언어의 차기 버전인 Go 1.27에 새로운 JSON 표준 패키지인 'encoding/json/v2'가 기본 탑재되면서 개발자들 사이에서 큰 주목을 받고 있습니다. 컴퓨터 과학 교수이자 유명 연구자인 다니엘 르미르(Daniel Lemire)는 이 새로운 JSON 엔진의 실제 성능을 다각도로 벤치마크 테스트한 결과를 공유했습니다.
기존 Go의 'encoding/json' 패키지는 사용하기 편리하지만 속도가 느리다는 평을 받아왔습니다. 이번 Go 1.27에서는 신규 API인 'json/v2'가 추가되었을 뿐만 아니라, 기존 레거시 API도 내부 엔진을 v2 기반으로 교체할 수 있도록 개편되었습니다. 이에 따라 개발자는 기존 구형 엔진(GOEXPERIMENT=nojsonv2), 신형 엔진 기반의 레거시 API, 그리고 완전히 새로운 v2 API의 세 가지 옵션을 사용할 수 있게 되었습니다. 단, 새 API는 유니코드 검증 방식이나 대소문자 구분 규칙 등이 달라 기존 코드를 그대로 1:1 대체하는 방식은 아닙니다.
다니엘 르미르 교수가 M4 Max 및 인텔 제온 환경에서 트위터 데이터 등 대표적인 JSON 벤치마크 데이터를 파싱(any/interface{}로 언마샬링)해 테스트한 결과, 새로운 v2 API는 기존 대비 역직렬화(Unmarshal)에서 1.5배~2.3배, 직렬화(Marshal)에서 1.2배~3배가량 더 빠른 성능을 보였습니다. 기존 레거시 API를 그대로 쓰더라도 Go 1.27로 판올림만 하면 직렬화 작업이 최대 2배까지 빨라지는 개선 효과가 확인되었습니다.
하지만 반전도 있었습니다. 구조체가 미리 정의된 10,000건의 고정 스키마 슬라이스를 대상으로 직렬화(Marshal) 벤치마크를 수행했을 때는 오히려 구형 v1 엔진이 더 빠른 것으로 나타났습니다. Go 1.27 릴리스 노트에는 직렬화 성능이 이전 버전과 대체로 동등한 수준이라고 안내되어 있었으나, 실제 테스트에서는 타입이 명확히 정의된 구조체 직렬화 시 새 엔진이 구형 엔진보다 약 1.5배 더 느려지는 현상이 관찰되었습니다. 결과적으로 언마샬링 작업은 전반적으로 크게 향상되었으나, 정형화된 구조체의 마샬링 작업에서는 오히려 성능 저하가 발생할 수 있어 사용 사례에 따른 주의가 필요한 상황입니다.
해외 반응 번역
르미르 교수님, 교수님의 글에 영감을 받아 Go JSON v2용 고정 필드 패스트 패스를 연구해 보았습니다. 테스트한 레코드 픽스처에서 동일 기기 기준 수정되지 않은 v2 대비 인코딩 시간이 33.49% 단축되었지만, 여전히 레거시가 더 빠릅니다. 일부 대조군 결과는 추가 조사가 필요합니다. 좋은 도전 과제를 주셔서 감사합니다!
Sponsored · 광고