Comparación de rendimiento de ProtoBuf y JSON

Serialización: Comparación de ProtoBuf y JSON!
Introducción

ProtoBuf es una herramienta desarrollada por el equipo de Google para almacenar y leer datos estructurados de manera eficiente. Los datos estructurados, tal como se expresan literalmente, son datos con cierta estructura. Por ejemplo, hay muchos registros en la guía telefónica y cada registro contiene nombre, ID, correo electrónico, teléfono, etc. Esta estructura se repite.

similar

XML y JSON también se pueden usar para almacenar tales datos estructurados, pero los datos representados por ProtoBuf pueden ser más eficientes y comprimir los datos más pequeños.

principio

ProtoBuf utiliza el compilador ProtoBuf para compilar los archivos de estructura de datos de sufijo .proto únicos que no están relacionados con el lenguaje de programación en archivos de clase específicos para cada lenguaje de programación (Java, C / C ++, Python), y luego a través del soporte de cada lenguaje de programación. proporcionado por Google La biblioteca lib puede llamar a la API. (Para saber cómo escribir la estructura del proto, puede consultar la documentación usted mismo)

Instalación del compilador ProtoBuf

Mac: brew instalar protobuf

por ejemplo

1. Primero crea un archivo proto

message.proto

syntax = "proto3";

message Person {
    int32 id = 1;
    string name = 2;

    repeated Phone phone = 4;

    enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
    }

    message Phone {
        string number = 1;
        PhoneType type = 2;
    }
}

Copie el código
2. Cree un proyecto Java
y coloque el archivo proto en la carpeta src / main / proto

3. Compile el archivo proto en la versión de Java y
use la línea de comando para acceder al directorio src / main.

Comando de ejecución de terminal: protocol --java_out =. / Java ./proto/*.proto

Encontrará que la clase Java correspondiente se ha generado en su src / main / java

4. Confíe en la versión Java de la biblioteca de soporte ProtoBuf.
Aquí hay solo un ejemplo que usa Gradle para usar dependencias.

deployment'com.google.protobuf: protobuf-java: 3.9.1'Copy
code
5. Convierta objetos Java en datos ProtoBuf

Message.Person.Phone.Builder phoneBuilder = Message.Person.Phone.newBuilder();
Message.Person.Phone phone1 = phoneBuilder
        .setNumber("100860")
        .setType(Message.Person.PhoneType.HOME)
        .build();
Message.Person.Phone phone2 = phoneBuilder
        .setNumber("100100")
        .setType(Message.Person.PhoneType.MOBILE)
        .build();
Message.Person.Builder personBuilder = Message.Person.newBuilder();
personBuilder.setId(1994);
personBuilder.setName("XIAOLEI");
personBuilder.addPhone(phone1);
personBuilder.addPhone(phone2);

Message.Person person = personBuilder.build();
long old = System.currentTimeMillis();
byte[] buff = person.toByteArray();
System.out.println("ProtoBuf 编码耗时:" + (System.currentTimeMillis() - old));
System.out.println(Arrays.toString(buff));
System.out.println("ProtoBuf 数据长度:" + buff.length);

Copie el código
6. Vuelva a convertir los datos de ProtoBuf en un objeto Java

System.out.println("-开始解码-");
old = System.currentTimeMillis();
Message.Person personOut = Message.Person.parseFrom(buff);
System.out.println("ProtoBuf 解码耗时:" + (System.currentTimeMillis() - old));
System.out.printf("Id:%d, Name:%s\n", personOut.getId(), personOut.getName());
List<Message.Person.Phone> phoneList = personOut.getPhoneList();
for (Message.Person.Phone phone : phoneList)
{
    System.out.printf("手机号:%s (%s)\n", phone.getNumber(), phone.getType());
}

Copiar código
Comparar

Para reflejar las ventajas de ProtoBuf, escribí una clase Java con la misma estructura y convertí objetos Java en datos JSON para compararlos con ProtoBuf. La biblioteca de compilación JSON utiliza la biblioteca GSON proporcionada por Google, parte del código JSON no se publicará y los resultados se mostrarán directamente.

Comparación de resultados

Ejecutar 1 vez

[Codificación de inicio JSON] Codificación
JSON una vez, requiere mucho tiempo: 22 ms
Longitud de datos JSON: 106
-comience a decodificar- Decodificación
JSON una vez, requiere mucho tiempo: 1 ms

[Codificación de inicio de ProtoBuf] Codificación de
ProtoBuf una vez, requiere mucho tiempo: 32ms
Longitud de datos de ProtoBuf: 34
-comienza la decodificación- Decodificación de
ProtoBuf una vez, requiere mucho tiempo: 3ms
copie el código y
ejecútelo 10 veces

[Codificación de inicio JSON] Codificación
JSON 10 veces, tiempo: 22 ms
Longitud de datos JSON: 106
- decodificación inicial - Decodificación
JSON 10 veces, tiempo: 4 ms

[Codificación de inicio de ProtoBuf] Codificación de
ProtoBuf 10 veces, requiere mucho tiempo: 29ms
Longitud de datos de ProtoBuf: 34
- decodificación de
inicio - Decodificación de ProtoBuf 10 veces, requiere tiempo: 3ms de ejecución de
código de copia
100 veces

[Codificación de inicio JSON] Codificación
JSON 100 veces, requiere mucho tiempo: 32 ms
Longitud de datos JSON: 106
- decodificación inicial - Decodificación
JSON 100 veces, requiere tiempo: 8 ms

[Codificación de inicio de ProtoBuf] Codificación de
ProtoBuf 100 veces, requiere mucho tiempo: 31ms
Longitud de datos de ProtoBuf: 34
- decodificación de
inicio - Decodificación de ProtoBuf 100 veces, requiere tiempo: 4ms de ejecución de
código de copia
1000 veces

[Codificación de inicio JSON] Codificación
JSON 1000 veces, requiere mucho tiempo: 39 ms
Longitud de datos JSON: 106
- decodificación inicial - Decodificación
JSON 1000 veces, requiere tiempo: 21 ms

[Codificación de inicio de ProtoBuf] Codificación de
ProtoBuf 1000 veces, requiere mucho tiempo: 37ms
Longitud de datos de ProtoBuf: 34
- decodificación de
inicio - Decodificación de ProtoBuf 1000 veces, requiere tiempo: el
código de copia de 8 ms se
ejecuta 10,000 veces

[Codificación de inicio JSON] Codificación
JSON 10000 veces, mucho tiempo: 126 ms
Longitud de datos JSON: 106
- decodificación inicial - Decodificación
JSON 10000 veces, mucho tiempo: 93 ms

] [Protobuf comienza a codificar
protobuf codifica 10000, procesado: 49ms
longitud de datos protobuf: 34
- Inicio de decodificación -
protobuf decodifica 10,000, procesado: 23ms
copie el código
para ejecutar 100,000

[Iniciando la codificación JSON] Codificación
JSON 100000 veces, requiere mucho tiempo: 248 ms Longitud de los
datos JSON: 106 -Inicio de la
decodificación- Decodificación
JSON 100000 veces, requiere mucho tiempo: 180 ms

] [Protobuf comienza a codificar
protobuf codificación 100,000, Procesado: 51 ms
Protobuf longitud de datos: 34
- Inicio de decodificación -
Protobuf decodificación 100,000, Procesado: 58 ms
copie el
resumen del código

Rendimiento de codificación y decodificación Las
castañas anteriores son solo una muestra. De hecho, según mis experimentos,

Cuando la frecuencia es inferior a 1000, el rendimiento de codificación y decodificación de ProtoBuf es comparable a JSON, e incluso peor que JSON.
El número de veces es más de 2000, y el rendimiento de codificación y decodificación de ProtoBuf es mucho mayor que el de JSON.
Cuando el número supera los 100.000, el rendimiento del códec de ProtoBuf es obvio, que es mucho más alto que el rendimiento de JSON.
La memoria ocupa
34 de la memoria de ProtoBuf, mientras que JSON llega a 106, la memoria de ProtoBuf ocupa solo 1/3 de JSON.

fin

De hecho, este experimento tiene mucho que optimizar e incluso este tipo de prueba aproximada puede ver las ventajas de ProtoBuf.

compatible

Nuevo campo

Agregue el campo de apodo al archivo proto

Generar archivos Java

Utilice los datos de la matriz de proto bytes antiguos, conviértalos en un objeto

Id: 1994, Nombre: XIAOLEI Número de móvil: 100860 (CASA) Número de móvil: 100100 (MÓVIL) getNickname =

Como resultado, la conversión puede tener éxito.

Eliminar campo

Eliminar el campo de nombre en el archivo proto

Generar archivos Java

Utilice los datos de la matriz de proto bytes antiguos, conviértalos en un objeto

Id: 1994, Nombre: nulo Número de móvil: 100860 (CASA) Número de móvil: 100100 (MÓVIL)

Como resultado, la conversión puede tener éxito.

Supongo que te gusta

Origin blog.csdn.net/qq_17010193/article/details/114391387
Recomendado
Clasificación