2010-08-18 16 views
43

Necesito un analizador C++ JSON & escritor. La velocidad y la fiabilidad son muy importantes, no me importa si la interfaz es buena o no, si está basada en Boost o no, incluso un analizador C está bien (si es considerablemente más rápido que los de C++).El lector/escritor JSON más rápido para C++

Si alguien tiene experiencia con la velocidad de los analizadores JSON disponibles, por favor asesórese.

+11

¿Cómo no te importa la bondad de una API de biblioteca? –

+3

Me importa la bondad de API, pero la mayoría de los libs disponibles tienden a sacrificar velocidad cuando intentan hacer que la interfaz sea agradable y fácil de usar. Para mi velocidad de propulsión es uno de los requisitos más críticos. – user424060

+3

Entiendo el sentimiento.Pero * siempre * elegí primero la biblioteca mejor respaldada/mejor diseñada, y construí un prototipo de ella, para verificar si la implementación de JSON está en la ruta crítica, y si hay algún sacrificio en términos de legibilidad/mantenibilidad en realidad tener sentido. Mida, optimice, mida. – DevSolar

Respuesta

8

http://lloyd.github.com/yajl/

http://www.digip.org/jansson/

no se sabe muy bien cómo se comparan para la velocidad, pero el primero de ellos se parece a la idea correcta para escalar a los datos JSON realmente grandes, ya que analiza sólo un pequeño trozo a la un tiempo para que no necesiten contener todos los datos en la memoria de una vez (Esto puede ser más rápido o más lento según la biblioteca/caso de uso)

52

rapidjson es un generador/analizador C++ JSON diseñado para ser rápido y pequeño huella de memoria.

Hay un performance comparison con YAJL y JsonCPP.


Actualización:

creé un proyecto de código abierto Native JSON benchmark, que evalúa 29 (y en aumento) bibliotecas de C/C++ JSON, en términos de la conformidad y de rendimiento. Esto debería ser una referencia útil.

+1

rapidjson, excepto por todas las macros de preprocesamiento y la llamada a 'setjmp' que parece una buena biblioteca. – dalle

+2

gracias! Ahora obtuve un tiempo de análisis de más de 7 segundos en JsonCpp a 1.5373. –

+1

@dalle Solo como una actualización, 'setjmp' ha sido eliminado por algunos años. Gracias por tu comentario de todos modos. –

4

https://github.com/quartzjer/js0n

más feo interfaz posible, pero hace lo que se le pregunte. Zero allocations.

http://zserge.com/jsmn.html Otro enfoque de asignación cero.

Las soluciones publicadas anteriormente hacen asignación de memoria dinámica, por lo tanto, inevitablemente terminarán más lentas en algún momento, dependiendo de la estructura de datos, y será peligroso incluirlas en un entorno restringido como un sistema integrado.

Los puntos de referencia de vjson, rapidjson y sajson aquí: http://chadaustin.me/2013/01/json-parser-benchmarking/ si estás interesado en ese tipo de cosas.

Y para responder a su parte "escritor" de la cuestión i duda que podría vencer a un eficiente aplicación

printf("{%s:%s}",name,value) 

con cualquier biblioteca - asumiendo que su aplicación printf/sprintf sí es de peso ligero, por supuesto.

EDITAR: en realidad, permítanme retroceder, RapidJson permite la asignación en la pila solo a través de su MemoryPoolAllocator y, de hecho, hace que esto sea un valor predeterminado para su GenericReader. No he hecho la comparación, pero espero que sea más robusta que cualquier otra lista aquí. Tampoco tiene dependencias, y no arroja excepciones que probablemente lo hagan finalmente apto para incrustado. Lib completo basado en encabezado así que es fácil de incluir en cualquier lugar.

Cuestiones relacionadas