web-dev-qa-db-fra.com

Lecteur / enregistreur JSON le plus rapide pour C ++

J'ai besoin d'un analyseur et d'un écrivain C++ JSON. La vitesse et la fiabilité sont très critiques, peu m'importe si l'interface est Nice ou non, qu'elle soit basée sur Boost ou non, même un analyseur C est très bien (s'il est considérablement plus rapide que ceux C++).

Si quelqu'un a de l'expérience avec la vitesse des analyseurs JSON disponibles, veuillez en informer.

48
user424060

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

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

Je ne sais pas vraiment comment ils se comparent pour la vitesse, mais la première semble être la bonne idée pour évoluer vers de très grandes données JSON, car elle n'analyse qu'un petit morceau à la fois, donc ils n'ont pas besoin de conserver toutes les données dans mémoire à la fois (cela peut être plus rapide ou plus lent selon la bibliothèque/le cas d'utilisation)

10
Spudd86

rapidjson est un analyseur/générateur C++ JSON conçu pour être rapide et peu encombrant.

Il y a comparaison des performances avec YAJL et JsonCPP.


Mise à jour:

J'ai créé un projet open source benchmark JSON natif , qui évalue 29 (et en augmentation) bibliothèques JSON C/C++, en termes de conformité et de performances. Cela devrait être une référence utile.

78
Milo Yip

https://github.com/quartzjer/js0n

Interface la plus laide possible, mais fait ce que vous demandez. Zéro allocations.

http://zserge.com/jsmn.html Une autre approche d'allocation nulle.

Les solutions publiées avant tout font une allocation dynamique de mémoire, par conséquent, elles finiront inévitablement plus lentement à un moment donné, en fonction de la structure des données - et seront dangereuses à inclure dans un environnement contraint en tas comme un système embarqué.

Les références de vjson, rapidjson et sajson ici: http://chadaustin.me/2013/01/json-parser-benchmarking/ si vous êtes intéressé par ce genre de chose.

Et pour répondre à votre partie "écrivain" de la question, je doute que vous puissiez battre un

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

implémentation avec n'importe quelle bibliothèque - en supposant que votre implémentation printf/sprintf elle-même soit bien sûr légère.

EDIT: permettez-moi de reprendre cela, RapidJson autorise l'allocation sur pile uniquement via son MemoryPoolAllocator et en fait en fait une valeur par défaut pour son GenericReader. Je n'ai pas fait la comparaison mais je m'attendrais à ce qu'il soit plus robuste que toute autre chose listée ici. Il n'a pas non plus de dépendances, et il ne génère pas d'exceptions, ce qui le rend probablement adapté à l'intégration. Lib entièrement basé sur l'en-tête donc, facile à inclure n'importe où.

6
kert