JSON is incredibly slow: Here's What's Faster!
Medium
JSON의 성능 문제
구문 분석 오버헤드: JSON 데이터는 사용 가능한 데이터 구조로 변환하기 위해 구문 분석 과정을 거쳐야 합니다. 이 과정은 복잡하거나 큰 JSON 데이터를 다룰 때 상대적으로 느릴 수 있습니다.
직렬화 및 역직렬화: JSON은 데이터를 문자열로 인코딩하고 이를 다시 객체로 변환하는 과정을 필요로 합니다. 이 과정은 애플리케이션의 전반적인 속도에 영향을 줄 수 있습니다.
문자열 조작: JSON은 문자열 조작에 크게 의존합니다. 이는 이진 데이터를 다루는 것보다 느릴 수 있습니다.
데이터 타입의 부족: JSON은 제한된 데이터 타입을 가지고 있어 복잡한 데이터 구조를 효율적으로 표현하는 데 한계가 있습니다.
장황함: JSON의 인간 친화적 설계는 데이터 전송 시간을 늘릴 수 있는 중복 키와 반복 구조를 초래할 수 있습니다.
JSON의 대안들
프로토콜 버퍼(protobuf): 구글이 개발한 이진 직렬화 형식으로, JSON보다 직렬화와 역직렬화에서 훨씬 빠릅니다.
메시지팩(MessagePack): 속도와 소형성을 위해 설계된 또 다른 이진 직렬화 형식입니다.
BSON(Binary JSON): JSON에서 파생된 이진 인코딩 형식으로, JSON의 유연성을 유지하면서 성능을 향상시킵니다.
아파치 아브로(Apache Avro): 스키마 기반의 데이터 직렬화 프레임워크로, 효율적인 데이터 인코딩과 디코딩을 제공합니다.
JSON 성능 최적화를 위한 실용적인 팁
데이터 크기 최소화:
짧고 기술적인 키 사용: JSON 객체의 크기를 줄이기 위해 간결하면서 의미 있는 키 이름을 선택합니다.
가능할 때 약어 사용: 명확성을 희생하지 않는 한, 키나 값에 대해 약어를 사용합니다.
배열 사용 최적화:
중첩 최소화: 깊게 중첩된 배열을 피함으로써 JSON의 파싱과 탐색 복잡성을 줄입니다.
숫자 표현 최적화:
가능한 경우 정수 사용: 값이 정수로 표현될 수 있다면, 부동 소수점 숫자 대신 정수를 사용합니다.
중복 제거:
반복적인 데이터 피하기: 공유되는 값에 대한 참조를 사용하여 중복 데이터를 제거합니다.
압축 사용:
압축 알고리즘 적용: 가능하다면 Gzip이나 Brotli와 같은 압축 알고리즘을 사용하여 전송 중인 JSON payload 의 크기를 줄입니다.
서버 측 캐싱 활용:
JSON 응답 캐시: 서버 측 캐싱을 구현하여 JSON 응답을 효율적으로 저장하고 제공함으로써 반복적인 데이터 처리의 필요성을 줄입니다.
프로파일링 및 최적화:
성능 프로파일링: 프로파일링 도구를 사용하여 JSON 처리 코드의 병목 현상을 식별하고 해당 부분을 최적화합니다.
실제 사례
LinkedIn의 프로토콜 버퍼 통합:
Challenge: LinkedIn은 JSON의 복잡성으로 인해 네트워크 대역폭 사용이 증가하고, 이로 인해 지연 시간이 늘어나는 문제에 직면했습니다.
Solution: 마이크로서비스 통신에서 JSON을 대체하기 위해 이진 직렬화 형식인 프로토콜 버퍼를 채택했습니다.
Impact: 이 최적화는 지연 시간을 최대 60%까지 줄여 LinkedIn 서비스의 속도와 반응성을 향상시켰습니다.
Uber의 H3 Geo-Index:
Challenge: Uber는 다양한 지리 공간 데이터 표현을 위해 JSON을 사용했지만, 대규모 데이터셋에 대한 JSON 파싱이 알고리즘을 느리게 했습니다.
Solution: 그들은 JSON 파싱 오버헤드를 줄이기 위해 효율적인 육각형 그리드 시스템인 H3 Geo-Index를 도입했습니다.
Impact: 이 최적화는 지리 공간 작업을 크게 가속화하여 Uber의 차량 호출 및 지도 서비스를 개선했습니다.
Slack의 메시지 형식 최적화:
Challenge: Slack은 실시간 채팅에서 대량의 JSON 형식 메시지를 전송하고 렌더링해야 했으며, 이로 인해 성능 병목 현상이 발생했습니다.
Solution: 불필요한 데이터를 줄이고 각 메시지에 필수 정보만 포함시키도록 JSON 구조를 최적화했습니다.
Impact: 이 최적화는 메시지 렌더링 속도를 높이고 Slack 사용자들의 전반적인 채팅 성능을 향상시켰습니다.
Auth0의 프로토콜 버퍼 구현:
Challenge: 인증 및 접근 관리 플랫폼인 Auth0는 인증 및 권한 부여 데이터를 처리할 때 JSON의 성능 문제에 직면했습니다.
Solution: 인증 관련 데이터의 인코딩 및 디코딩을 위해 JSON을 프로토콜 버퍼로 대체했습니다.
Impact: 이 최적화는 데이터 직렬화 및 역직렬화 속도를 크게 향상시켜 인증 과정을 빠르게 하고 Auth0 서비스의 전반적인 성능을 개선했습니다.
https://medium.com/data-science-community-srm/json-is-incredibly-slow-heres-what-s-faster-ca35d5aaf9e8
다음 내용이 궁금하다면?
이미 회원이신가요?
2024년 1월 5일 오전 1:03
저
... 더 보기J
... 더 보기Next.js 까보기: "쓸 줄 아는 개발자"에서 "알고 쓰는 개발자로" 강의를
... 더 보기누
... 더 보기1. 어제의 태양은 오늘의 태양과 다르다. 이름만 같을 뿐, 둘은 전혀 다른 존재다.