protocol protobuf google buffers c++ performance serialization boost protocol-buffers

protobuf - Rendimiento de serialización C++



proto google (8)

Me vienen a la mente ACE y ACE TAO, pero puede que no te guste el tamaño y el alcance de la misma. http://www.cs.wustl.edu/~schmidt/ACE.html

En cuanto a su consulta sobre "rápido" y aumentar. Ese es un término subjetivo y sin conocer sus requisitos (rendimiento, etc.) es difícil responder eso por usted. No es que tenga ningún punto de referencia para el impulso de mí mismo ...

Hay capas de mensajes que puedes usar, pero probablemente sean más lentas que el impulso. Diría que identificó una buena solución en el impulso, pero solo he usado ACE y otros productos de comunicaciones / mensajería de propiedad.

Estoy construyendo una aplicación C ++ distribuida que necesita mucha serialización y deserialización de estructuras de datos simples que se pasan entre diferentes procesos y computadoras.

No estoy interesado en serializar jerarquías de clases complejas, sino más en enviar estructuras con algunos miembros simples, como números, cadenas y vectores de datos. Los vectores de datos a menudo pueden ser muchos megabytes de gran tamaño. Me preocupa que las formas de hacerlo basadas en texto / xml sean demasiado lentas y realmente no quiero escribir esto, ya que problemas como la codificación de cadenas y la endiacia numérica pueden complicarlo mucho más de lo que parece en la superficie.

He estado buscando un poco en los búferes de protocolo y boost.serialize. De acuerdo con los documentos, los búferes de protocolo parecen preocuparse mucho por el rendimiento. Boost parece algo más liviano en el sentido de que no tienes un lenguaje externo para especificar el formato de datos que considero bastante conveniente para este proyecto en particular.

Así que mi pregunta se reduce a esto: ¿alguien sabe si la serialización de impulso es rápida para el caso de uso típico que describí anteriormente?

Además, si hay otras bibliotecas que podrían ser adecuadas para esto, me gustaría saber de ellas.


Mi suposición es que el impulso es lo suficientemente rápido. Lo he usado en proyectos anteriores para serializar datos hacia y desde el disco, y su rendimiento nunca llegó a ser un problema.

Mi answer aquí se refiere a la serialización en general, que puede serle útil más allá de la biblioteca de serialización que elija usar.

Una vez dicho esto, parece que conoce la mayoría de los principales puntos conflictivos con serialización (codificación de cadena endianess). Olvidó la versión y la compatibilidad con versiones anteriores y posteriores. Si el tiempo no es crítico, recomiendo escribir su propio código de serialización. Es una experiencia iluminadora, y las lecciones que aprendes son invaluables. Aunque te advertiré, tenderá a hacerte odiar los protocolos basados ​​en XML por su hinchazón. :)

Cualquiera que sea el camino que elija, buena suerte con su proyecto.


No optimizar de manera preventiva. Mida primero y optimice el segundo.


Si solo está enviando estructuras de datos definidas y bien definidas, ¿entonces quizás debería considerar ASN.1 como una metodología de codificación?


Sugeriría buffers de protocolo. Son increíblemente fáciles de usar, ofrecen un gran rendimiento y se ocupan de cuestiones como la compatibilidad endianness y la compatibilidad con versiones anteriores. Para hacerlo aún más atractivo, los datos seriados son independientes del lenguaje gracias a numerosas implementaciones de idiomas.



También hay Thrift , que parece un proyecto alfa pero es usado y desarrollado por Facebook, por lo que tiene pocos usuarios del mismo.

O el viejo DCE , que era el estándar que MS decidió usar para COM. Ahora es de código abierto, 20 años demasiado tarde, pero mejor que nunca.


boost.serialization no se preocupa por las codificaciones de cadena o endianness. De igual forma, te irá bien si no lo usas si eso te importa.

Es posible que desee examinar ICE desde ZeroC: http://www.zeroc.com/

Funciona de manera similar a CORBA, excepto que está completamente especificado y definido por la compañía. Lo bueno es que las implementaciones funcionan como se esperaba, ya que no hay tantas. La desventaja es que si usa un idioma que no admite, no tiene suerte.