2011-06-02 16 views
11

Necesito serializar objetos moderadamente complejos con 1-100 de propiedades de tipo mixto.La serialización más rápida posible de objetos Javascript con Google V8

JSON se usó originalmente, luego cambié a BSON, que es marginalmente más rápido. objetos

Codificación 10000 muestra

JSON:  1807mS 
BSON:  1687mS 
MessagePack: 2644mS (JS, modified for BinaryF) 

Quiero un orden de magnitud aumento; está teniendo un impacto ridículamente malo en el resto del sistema.

Parte de la motivación para pasar a BSON es el requisito para codificar datos binarios, por lo que JSON es (ahora) inadecuado. Y porque simplemente omite los datos binarios presentes en los objetos, está "haciendo trampa" en esos puntos de referencia.

perfilada rendimiento BSON hot-spots

  • (inevitable?) Conversión de cadenas UTF16 V8 JS para UTF8.
  • malloc y de cadena de operaciones dentro de la biblioteca BSON

El codificador BSON se basa en la biblioteca Mongo BSON.

Un serializador binario nativo V8 puede ser maravilloso, pero como JSON es nativo y rápido de serializar, temo que incluso eso podría no dar la respuesta. Tal vez mi mejor opción es optimizar la biblioteca BSON o escribir mi propia figura más eficiente para extraer cadenas del V8. Una táctica podría ser agregar soporte UTF16 a BSON.

Así que estoy aquí para obtener ideas, y tal vez un control de cordura.

Editar

referencia Agregado MessagePack. Esto fue modificado desde el JS original para usar BinaryF.

La biblioteca MessagePack de C++ puede ofrecer más mejoras, puedo compararla de forma aislada para compararla directamente con la biblioteca BSON.

+0

Quizás podría proporcionar un caso de prueba http://jsperf.com/ para ayudar a comprender el tipo de datos que necesita almacenar –

+0

Solo objetos JS estándar: {param1: "nombre", param2: {paramA: 1, paramB: [0x0,0x1,0x2], paramC: }} con hasta 100 propiedades, anidadas arbitrariamente, algunas de las cuales contendrán matrices de bytes utilizando CommonJS BinaryF. Sin BinaryF y un serializador BSON, es imposible hacer comparaciones útiles. – hplbsh

+0

¿Tiene algún enlace/referencia a lo que utilizó para BSON, MsgPack, etc.? –

Respuesta

5

para la serialización/deserialización protobuf es bastante difícil de superar. No sé si puedes cambiar el protocolo de transporte. Pero si puedes protobuf definitivamente debe ser considerado.

Echa un vistazo a todas las respuestas a Protocol Buffers versus JSON or BSON.

La respuesta aceptada elige thrift. Sin embargo, es más lento que protobuf. Sospecho que fue elegido por su facilidad de uso (con Java), no por la velocidad. These Java benchmarks son muy reveladores.
Es de destacar

  • MongoDB-45042 BSON
  • protobuf 6539
  • Protostuff/protobuf 3318

Los puntos de referencia son Java, me imagino que puede alcanzar velocidades cercanas a la implementación Protostuff de protobuf, es decir, 13.5 veces más rápido. En el peor de los casos (si por alguna razón, Java es mejor para la serialización), no se puede empeorar la implementación simple de protobuf no optimizado que se ejecuta 6.8 veces más rápido.

+0

Gracias por los puntos de referencia. Los datos son generados por el usuario, por lo que el protocolo PB necesitaría llevar pares de clave/valor que socaven algunos de sus beneficios de rendimiento, pero espero que continúe siendo un gran margen. No es compatible con UTF16, por lo que agregar ese tipo no debería ser difícil. – hplbsh

+0

Me he quedado con BSON y optimizar incrementalmente es como y cuando. Pero puedo regresar a protobuf en algún momento. Gracias. – hplbsh

3

Eche un vistazo a MessagePack. Es compatible con JSON. A partir de los documentos:

rápido y compacto serialización

MessagePack es una biblioteca eficiente serialización de objetos basados ​​en binario. Permite intercambiar objetos estructurados entre muchos lenguajes como JSON. Pero a diferencia de JSON, es muy rápido y pequeño.

entero pequeño típico (como banderas o código error) se guarda sólo en 1 byte, y cadena corta típica sólo necesita 1 byte excepto la longitud de la cadena sí mismo.[1,2,3] (3 elementos de la matriz) es serializado en 4 bytes usando MessagePack como sigue:

+0

Interesante, +1 –

+0

¡Fantástico! ¡Definitivamente vale la pena probar! Primero daré una oportunidad a la implementación de JS. – hplbsh

+0

Se agregó el benchmark MessagePack. Lo hice bastante bien considerando que es JS puro ... – hplbsh

1

Si está más interesado en la velocidad de deserialización, eche un vistazo a la biblioteca JBB (Javascript Binary Bundles). Es más rápido que BSON o MsgPack.

desde el wiki, página JBB vs BSON vs MsgPack:

...

  • JBB es de un 70% más rápido que Binary JSON (BSON) y alrededor del 30% más rápido que la velocidad de decodificación MsgPack, incluso con un caso de prueba negativo (n. ° 3).
  • JBB crea archivos que (incluso sus versiones comprimidas) son aproximadamente un 61% más pequeños que Binary-JSON (BSON) y aproximadamente un 55% más pequeños que MsgPack.

...

Por desgracia, no es un formato de streaming, lo que significa que debe pre-proceso de su conexión de datos. Sin embargo, hay un plan para convertirlo en un formato de transmisión (verifique los hitos).

Cuestiones relacionadas