Biblioteca Rust JSON de alto rendimiento sonic-rs de código abierto

1. Introducción a Sonic-RS

sonic-rs es una biblioteca Rust JSON de alto rendimiento basada en SIMD, que es la versión Rust de la biblioteca Sonic JSON.

El proyecto de código abierto Bytedance Sonic ahora incluye múltiples bibliotecas JSON en diferentes idiomas (como se muestra a continuación). Entre ellos, sonic-go fue el primero en ser de código abierto y utilizó tecnología JIT y SIMD, y sonic-cpp utilizó plantillas C ++ y tecnología SIMD. Ambas bibliotecas JSON se han implementado a gran escala dentro de Byte. En el contexto de la optimización de costos, para ayudar a las empresas de Golang a migrar a Rust y optimizar el rendimiento de Rust JSON, desarrollamos una biblioteca JSON de alto rendimiento sonic-rs en lenguaje Rust puro basada en nuestra experiencia y práctica de optimización de JSON.

Las funciones JSON actualmente admitidas por sonic-rs son relativamente completas, básicamente están alineadas con las funciones relacionadas de serde-json y proporcionan funciones más ricas e interfaces de mayor rendimiento. Las principales características de sonic-rs son:

  • FastStrBásicamente compatible con el ecosistema Serde y también admite tipos en Volo.

  • Admite codificación y decodificación de tipos dinámicos y análisis bajo demanda

  • Tipos de soporte LazyVaue, RawNumberetc.

  • Admite UTF-8precisión de punto flotante estándar de suma de comprobación

En términos de rendimiento, nos basamos en la estructura de Rust y los datos JSON proporcionados por el punto de referencia oficial de serde-rs ( https://github.com/serde-rs/json-benchmark ) y comparamos serde-json, simd-json y sonic. -rs en Se probó el rendimiento de análisis bajo la estructura de Rust y se puede encontrar que el rendimiento de sonic-rs es 1,5 ~ 2 veces mayor que el de simd-json y 2 veces mayor que el de serde-json:

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]


Segundo, práctica de optimización de Sonic-RS.

La optimización de sonic-rs se basa principalmente en SIMD y parte de ella se basa en las ideas de optimización de otras bibliotecas JSON como simd-json. SIMD (instrucción única, datos múltiples) es una tecnología de optimización paralela que puede procesar múltiples datos en paralelo con una instrucción. La mayoría de las CPU actuales ya admiten varios conjuntos de instrucciones SIMD. Por ejemplo, SSE, AVX2, AVX512 en arquitectura x86_64, conjunto de instrucciones de neón en arquitectura aarch64, etc. Después de optimizar usando instrucciones SIMD, para una tarea adecuada, el programa ejecutará menos instrucciones y, por lo tanto, funcionará mejor.

En términos de diseño general, sonic-rs no adopta la idea de análisis en dos etapas de simd-json. Aplica principalmente la optimización SIMD a los puntos calientes en el análisis y serialización JSON, incluida la serialización de cadenas, el análisis bajo demanda y el punto flotante. análisis de números espera.

2.1 Serialización de cadenas optimizada SIMD

La serialización de cadenas es el punto caliente de la serialización JSON. Al serializar, debe escanear la cadena en busca de caracteres de escape. Para cadenas más largas, la operación de determinar los caracteres de escape byte a byte lleva mucho tiempo. El escaneo de caracteres de escape es muy adecuado para acelerar el uso de SIMD.

Si utiliza instrucciones AVX2 para escanear caracteres de escape, como se muestra en el siguiente código. Este código SIMD está bajo la arquitectura Haswell. Después de activar la optimización O3, en realidad solo hay seis instrucciones SIMD, es decir, 6 instrucciones SIMD pueden escanear 32 bytes a la vez. En comparación con el código escalar, la cantidad de instrucciones del programa se reduce considerablemente, lo que reduce el tiempo de ejecución del programa.

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 Análisis bajo demanda de optimización SIMD

Muchos escenarios empresariales solo utilizan algunos campos en JSON, lo que es muy adecuado para el análisis bajo demanda y omitir campos JSON innecesarios durante el análisis. Al omitir campos JSON, la dificultad radica en cómo omitir de manera eficiente objetos y matrices en JSON.

Según las reglas gramaticales que deben coincidir los corchetes de objetos y matrices en JSON, sonic-rs usa SIMD para implementar un algoritmo eficiente de coincidencia de corchetes. Primero obtenga el mapa de bits del objeto json y la matriz a través de SIMD, y luego omita el objeto y la matriz calculando el número de corchetes. Cuando se encuentra una coincidencia entre corchetes, se puede omitir el objeto o matriz.

2.3 Análisis de números de punto flotante optimizados para SIMD

El análisis de números de coma flotante es un punto crítico de rendimiento en el análisis JSON. Dentro de los bytes, encontramos que las mantisas de la mayoría de los números de coma flotante en JSON son relativamente largas y también son adecuadas para la optimización SIMD. Como se muestra a continuación, para una mantisa numérica de punto flotante de 16 bytes "1234342112345678":

  1. Primero lea esta cadena en el registro del vector. En este momento, cada número en el vector sigue siendo el valor del código ASCII.

  2. En segundo lugar, utilice la resta de vectores para restar el código ASCII '0' byte a byte para obtener v1. En este momento. Los números en v1 ya están en decimal.

  3. Luego, continúe usando instrucciones vectoriales para multiplicar y sumar cada número en v1 (multiplique el bit alto por 10 y sume el bit bajo) para obtener v2. Cada número en v2 ya es un número decimal de dos dígitos.

  4. Por analogía, utilizando instrucciones SIMD para acumular capa por capa, finalmente se obtiene v16. v16 contiene un número de 16 dígitos, que es el resultado final del análisis de mantisa.

  5. Finalmente, utilizamos instrucciones vectoriales para convertir el tipo v16 al tipo u64.

Todo el proceso de análisis puede completar el análisis de mantisa de punto flotante sin atravesar cada carácter de la mantisa de punto flotante.

3. estado y planes de sonic-rs

sonic-rs ha sido de código abierto durante más de tres meses y actualmente está iterado a la versión 0.3. Ya es compatible con la versión estable de Rust y es compatible con la arquitectura aarch64. sonic-rs ha acumulado algunos documentos de uso para ayudar a los desarrolladores en todos los aspectos:

En el futuro, Sonic-RS continuará mejorando el rendimiento, la facilidad de uso y la estabilidad. Se espera que admita Bytes/FastStrel análisis sin copia de tipos de datos comunes, admita la detección de instrucciones SIMD durante el ejercicio, etc. Los desarrolladores interesados ​​pueden unirse a nosotros. .

dirección del proyecto

GitHub: https://github.com/cloudwego 

Sitio web oficial: www.cloudwego.io

 

 

Los recursos pirateados de "Celebrating More Than Years 2" se cargaron en npm, lo que provocó que npmmirror tuviera que suspender el servicio unpkg. El equipo de inteligencia artificial de Microsoft en China empacó colectivamente y se fue a los Estados Unidos, involucrando a cientos de personas. Biblioteca de visualización frontal y el conocido proyecto de código abierto ECharts de Baidu: "ir al mar" para respaldar a Fish. ¡ Los estafadores utilizaron TeamViewer para transferir 3,98 millones! ¿Qué deberían hacer los proveedores de escritorio remoto? Zhou Hongyi: No queda mucho tiempo para que Google recomiende que todos los productos sean de código abierto. Un ex empleado de una conocida empresa de código abierto dio la noticia: después de ser desafiado por sus subordinados, el líder técnico se enfureció. Despidió a la empleada embarazada. Google mostró cómo ejecutar ChromeOS en una máquina virtual de Android. Por favor, dame un consejo, ¿qué papel juega aquí time.sleep(6)? Microsoft responde a los rumores de que el equipo de IA de China está "haciendo las maletas para Estados Unidos" El People's Daily Online comenta sobre la carga tipo matrioska del software de oficina: Sólo resolviendo activamente los "conjuntos" podremos tener un futuro
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/4843764/blog/11044020
Recomendado
Clasificación