1. Sonic-RS 소개
sonic-rs는 Sonic JSON 라이브러리의 Rust 버전인 SIMD를 기반으로 하는 고성능 Rust JSON 라이브러리입니다.
이제 Bytedance Sonic 오픈 소스 프로젝트에는 다양한 언어로 된 여러 JSON 라이브러리가 포함됩니다(아래 참조). 그 중 Sonic-go는 JIT와 SIMD 기술을 사용하여 최초로 오픈소스화되었으며, Sonic-cpp는 C++ 템플릿과 SIMD 기술을 사용하여 두 JSON 라이브러리 모두 Byte 내에서 대규모로 구현되었습니다. 비용 최적화 측면에서 Golang 비즈니스가 Rust로 마이그레이션하고 Rust JSON 성능을 최적화하도록 돕기 위해 우리는 JSON 최적화 경험과 실습을 기반으로 순수 Rust 언어로 고성능 JSON 라이브러리 sonic-rs를 개발했습니다.
-
sonic: https://github.com/bytedance/sonic (Golang JSON 라이브러리)
-
sonic-cpp: https://github.com/bytedance/sonic-cpp(C++ JSON 라이브러리)
-
sonic-rs: https://github.com/cloudwego/sonic-rs(Rust JSON 라이브러리)
현재 sonic-rs에서 지원하는 JSON 기능은 비교적 완벽하며 기본적으로 serde-json의 관련 기능과 일치하며 더 풍부한 기능과 더 높은 성능의 인터페이스를 제공합니다. Sonic-RS의 주요 기능은 다음과 같습니다.
-
기본적으로 Serde 생태계와 호환되며 Volo에서도
FastStr
유형을 지원합니다. -
동적 유형 인코딩 및 디코딩과 주문형 구문 분석 지원
-
지원
LazyVaue
등RawNumber
유형 -
UTF-8
체크섬 표준 부동 소수점 정밀도 지원
성능 측면에서는 serde-rs 공식 벤치마크( https://github.com/serde-rs/json-benchmark ) 에서 제공하는 Rust 구조와 JSON 데이터를 기반으로 serde-json, simd-json 및 Sonic을 비교했습니다. -rs in Rust 구조에서 구문 분석 성능을 테스트한 결과, sonic-rs의 성능은 simd-json의 1.5~2배, serde-json의 2배인 것을 확인할 수 있습니다.
twitter/sonic_rs::from_slice_unchecked
time: [694.74 µs 707.83 µs 723.19 µs]
twitter/sonic_rs::from_slice
time: [796.44 µs 827.74 µs 861.30 µs]
twitter/simd_json::from_slice
time: [1.0615 ms 1.0872 ms 1.1153 ms]
twitter/serde_json::from_slice
time: [2.2659 ms 2.2895 ms 2.3167 ms]
twitter/serde_json::from_str
time: [1.3504 ms 1.3842 ms 1.4246 ms]
citm_catalog/sonic_rs::from_slice_unchecked
time: [1.2271 ms 1.2467 ms 1.2711 ms]
citm_catalog/sonic_rs::from_slice
time: [1.3344 ms 1.3671 ms 1.4050 ms]
citm_catalog/simd_json::from_slice
time: [2.0648 ms 2.0970 ms 2.1352 ms]
citm_catalog/serde_json::from_slice
time: [2.9391 ms 2.9870 ms 3.0481 ms]
citm_catalog/serde_json::from_str
time: [2.5736 ms 2.6079 ms 2.6518 ms]
canada/sonic_rs::from_slice_unchecked
time: [3.7779 ms 3.8059 ms 3.8368 ms]
canada/sonic_rs::from_slice
time: [3.9676 ms 4.0212 ms 4.0906 ms]
canada/simd_json::from_slice
time: [7.9582 ms 8.0932 ms 8.2541 ms]
canada/serde_json::from_slice
time: [9.2184 ms 9.3560 ms 9.5299 ms]
canada/serde_json::from_str
time: [9.0383 ms 9.2563 ms 9.5048 ms]
2. Sonic-RS 최적화 실습
Sonic-rs의 최적화는 주로 SIMD를 기반으로 하며 그 중 일부는 simd-json과 같은 다른 JSON 라이브러리의 최적화 아이디어를 활용합니다. SIMD(Single Instruction, Multiple Data)는 하나의 명령어로 여러 데이터를 병렬로 처리할 수 있는 병렬 최적화 기술입니다. 오늘날 대부분의 CPU는 이미 다양한 SIMD 명령어 세트를 지원합니다. 예를 들어 x86_64 아키텍처의 SSE, AVX2, AVX512, aarch64 아키텍처의 네온 명령어 세트 등이 있습니다. 적절한 작업에 대해 SIMD 명령어를 사용하여 최적화한 후 프로그램은 더 적은 수의 명령어를 실행하므로 성능이 향상됩니다.
전반적인 디자인 측면에서 Sonic-rs는 simd-json의 2단계 구문 분석 아이디어를 채택하지 않습니다. 문자열 직렬화, 주문형 구문 분석 및 부동 소수점을 포함하여 JSON 구문 분석 및 직렬화의 핫스팟에 SIMD 최적화를 주로 적용합니다. 번호 분석 중입니다.
2.1 SIMD 최적화 문자열 직렬화
문자열 직렬화는 JSON 직렬화의 핵심입니다. 직렬화할 때 문자열에서 이스케이프 문자를 검색해야 합니다. 긴 문자열의 경우 이스케이프 문자를 바이트 단위로 결정하는 작업은 시간이 많이 걸립니다. 이스케이프 문자를 검색하는 것은 SIMD를 사용하여 속도를 높이는 데 매우 적합합니다.
다음 코드에 표시된 것처럼 AVX2 명령어를 사용하여 이스케이프 문자를 검색하는 경우. 이 SIMD 코드는 Haswell 아키텍처에 있습니다. O3 최적화가 활성화된 후에는 실제로 6개의 SIMD 명령어만 있습니다. 즉, 6개의 SIMD 명령어가 한 번에 32바이트를 스캔할 수 있습니다. 스칼라 코드에 비해 프로그램 명령 수가 대폭 줄어들어 프로그램 실행 시간이 단축됩니다.
static inline __m256i _mm256_find_quote(__m256i vv) {
__m256i e1 = _mm256_cmpgt_epi8 (vv, _mm256_set1_epi8(-1));
__m256i e2 = _mm256_cmpgt_epi8 (vv, _mm256_set1_epi8(31));
__m256i e3 = _mm256_cmpeq_epi8 (vv, _mm256_set1_epi8('"'));
__m256i e4 = _mm256_cmpeq_epi8 (vv, _mm256_set1_epi8('\\'));
__m256i r1 = _mm256_andnot_si256 (e2, e1);
__m256i r2 = _mm256_or_si256 (e3, e4);
__m256i rv = _mm256_or_si256 (r1, r2);
return rv;
}
2.2 SIMD 최적화 주문형 구문 분석
많은 비즈니스 시나리오에서는 JSON의 일부 필드만 사용합니다. 이는 주문형 구문 분석에 매우 적합하고 구문 분석 중에 불필요한 JSON 필드를 건너뛰는 데 매우 적합합니다. JSON 필드를 건너뛸 때 JSON의 개체와 배열을 효율적으로 건너뛰는 방법에 어려움이 있습니다.
JSON의 개체 및 배열 대괄호가 일치해야 하는 문법 규칙에 따라 sonic-rs는 SIMD를 사용하여 효율적인 대괄호 일치 알고리즘을 구현합니다. 먼저 SIMD를 통해 json 개체와 배열의 비트맵을 가져온 다음 대괄호 수를 계산하여 개체와 배열을 건너뜁니다. 대괄호 일치가 발견되면 객체 또는 배열을 건너뛸 수 있습니다.
2.3 SIMD 최적화 부동 소수점 수 분석
부동 소수점 숫자 구문 분석은 JSON 구문 분석의 성능 핫스팟입니다. 바이트 내에서 JSON에 있는 대부분의 부동 소수점 숫자의 가수는 상대적으로 길며 SIMD 최적화에도 적합하다는 것을 알 수 있습니다. 아래와 같이 16바이트 부동 소수점 숫자 가수 "1234342112345678"의 경우:
-
먼저 이 문자열을 벡터 레지스터로 읽어옵니다. 이때 벡터의 각 숫자는 여전히 ASCII 코드 값입니다.
-
둘째, 벡터 빼기를 사용하여 ASCII 코드 '0'을 바이트 단위로 빼서 v1을 얻습니다. 이때. v1의 숫자는 이미 10진수로 되어 있습니다.
-
그런 다음 벡터 명령을 계속 사용하여 v1의 각 숫자를 곱하고 더하여(높은 비트에 10을 곱하고 낮은 비트를 추가) v2를 얻습니다. v2의 각 숫자는 이미 두 자리 십진수입니다.
-
유사하게 SIMD 명령을 사용하여 레이어별로 누적하면 v16이 최종적으로 얻어집니다. v16에는 최종 가수 분석 결과인 16자리 숫자가 포함되어 있습니다.
-
마지막으로 벡터 명령어를 사용하여 v16을 u64 유형으로 변환합니다.
전체 구문 분석 프로세스는 부동 소수점 가수의 모든 문자를 순회하지 않고도 부동 소수점 가수 분석을 완료할 수 있습니다.
3. Sonic-RS 현황 및 계획
sonic-rs는 오픈 소스로 사용된 지 3개월이 넘었으며 현재 버전 0.3으로 반복되고 있습니다. 이미 Rust 안정 버전을 지원하고 aarch64 아키텍처를 지원합니다. Sonic-rs는 모든 측면에서 개발자를 돕기 위해 몇 가지 사용 문서를 축적했습니다.
-
Golang은 Sonic-rs를 사용하도록 Rust 사용자를 마이그레이션합니다: https://github.com/cloudwego/sonic-rs/blob/main/docs/for_Golang_user_zh.md
-
Rust serde-json 사용자 마이그레이션 sonic-rs: https://github.com/cloudwego/sonic-rs/blob/main/docs/serdejson_compatibility.md
-
성능 최적화 세부 정보: https://github.com/cloudwego/sonic-rs/blob/main/docs/performance_zh.md
앞으로 Sonic-rs는 성능, 사용 편의성 및 안정성을 지속적으로 개선할 예정입니다. Bytes/FastStr
일반 데이터 유형의 무복사 구문 분석, 운동 중 SIMD 명령 감지 지원 등을 지원할 예정입니다. 관심 있는 개발자의 참여를 환영합니다. .
프로젝트 주소
GitHub: https://github.com/cloudwego
공식 웹사이트: www.cloudwego.io
"Celebrateing More Than Years 2"의 불법 복제 리소스가 npm에 업로드되어 npmmirror가 unpkg 서비스 를 중단해야 했습니다. Microsoft의 중국 AI 팀은 수백 명의 사람들을 모아 미국으로 떠났습니다. 프론트엔드 시각화 라이브러리와 Baidu의 유명한 오픈 소스 프로젝트 ECharts - Fish 사기꾼을 지원하기 위한 "going to the sea"는 TeamViewer를 사용하여 398만 개를 전송했습니다! 원격 데스크톱 공급업체는 무엇을 해야 합니까? Zhou Hongyi: Google은 시간이 얼마 남지 않았습니다. 모든 제품을 오픈소스로 만드는 것이 좋습니다. 한 유명 오픈소스 회사의 전직 직원이 소식을 전했습니다. 부하 직원의 도전을 받은 후 기술 리더는 분노했습니다. Google은 Android 가상 머신에서 ChromeOS를 실행하는 방법을 보여주었습니다. 여기서 time.sleep(6)은 어떤 역할을 합니까? 마이크로소프트, 중국 AI 팀이 "미국을 위해 준비 중"이라는 루머에 대응 사무용 소프트웨어의 마트료시카 같은 충전에 대한 인민일보 온라인 논평: "세트"를 적극적으로 해결해야만 미래를 가질 수 있다