JSON Parser Benchmarking

by Chad Austin on January 31st, 2013

With the caveat that each parser provides different functionality and access to the resulting parse tree, I benchmarked sajsonrapidjsonvjsonYAJL, and Jansson.  My methodology was simple: given large-ish real-world JSON files, parse them as many times as possible in one second.  To include the cost of reading the parse tree in the benchmark, I then iterated over the entire document and summed the number of strings, numbers, object values, array elements, etc.

The documents are:

  • apache_builds.json: Data from the Apache Jenkins installation.  Mostly it’s a array of three-element objects, with string keys and string values.
  • github_events.json: JSON data from GitHub’s events feature.  Nested objects several levels deep, mostly strings, but also contains booleans, nulls, and numbers.
  • instruments.json: A very long array of many-key objects.
  • mesh.json: 3D mesh data. Almost entirely consists of floating point numbers.
  • update-center.json: Also from Jenkins though I’m not sure where I found it.

apache_builds.json, github_events.json, and instruments.json are pretty-printed with a great deal of interelement whitespace.

Now for the results. The Y axis is parses per second. Thus, higher is faster.

Core 2 Duo E6850, Windows 7, Visual Studio 2010, x86

Core 2 Duo E6850, Windows 7, Visual Studio 2010, AMD64

Atom D2700, Ubuntu 12.04, clang 3.0, AMD64

Raspberry Pi

Conclusions

sajson compares favorably to rapidjson and vjson, all of which stomp the C-based YAJL and Jansson parsers. 64-bit builds are noticeably faster: presumably because the additional registers are helpful. Raspberry Pis are slow. :)

4 Responses to “JSON Parser Benchmarking”

  1. Marco Says:

    Interesting! Would you mind sharing your sample apps? I wrote a json parser (https://github.com/mfascia/minja) and I would be interested in comparing its speed with these “reference” parsers. Thank you!

  2. kert Says:

    I was looking at a resource-constrained environment ( embedded MCU ) parser, found rapidjson and sajson and vjson, but i still dont like allocations at all.

    so i came across jsmn ( http://zserge.bitbucket.org/jsmn.html ) and ultaminimal js0n ( https://github.com/quartzjer/js0n ). I’m not particularly interested in speed but robustness and stability, but for kicks if you still have your benchmark setup code around i would rerun with these included – and im mostly interested in running on modern ARM-CortexM’s clocked at less than 100mhz : )

  3. Chad Austin Says:

    Hi kert,

    I did consider js0n but it wasn’t what I was looking for in that the generated “parse tree” isn’t complete. sajson is a similar concept (single-pass, fills one array) but the resulting parse tree is actually useful.

    I was not aware of jsmn at the time, thanks! If I update the benchmarks I’ll add jsmn: it looks pretty reasonable.

    Thanks,
    Chad

  4. Yasser Says:

    If you did an update, please include jvar (referenced on json.org)–a new C++ parser which uses JS style programming model in C++ and is quite fast.

Leave a Reply