Comparing JSON Parse Trees
I will soon post performance benchmarks of sajson, rapidjson, vjson, YAJL, and Jansson.
However, before talking about performance, I want to compare the parse trees generated by each library.
sajson
- Differentiates between integers and doubles
- Array lengths are known.
- Arrays are random-access.
- Object lengths are known.
- Object keys are sorted. Thus, random access of object elements is O(lg N).
- Stored contiguously in memory.
rapidjson
- At its root, rapidjson is a SAX-style parser. However, rapidjson does provide a default DOM implementation.
- Array and Object length are not directly accessible in the API but are accessible via
End() - Begin()
orMemberEnd() - MemberBegin()
. - Arrays support random access.
- Object lookup is O(N).
- Differentiates between integers, unsigned integers, 64-bit integers, 64-bit unsigned integers, and doubles.
- Parse tree is mutable.
vjson
- Namespaces its symbols under the generic "json" prefix.
- Differentiates between integers and floats. No support for doubles.
- Array and Object lengths are not stored. Instead a linked list must be traversed to calculate the length.
- Random array access is O(N).
- Object element lookup is O(N), by walking a linked list.
- Very simple interface.
YAJL
- Differentiates between integers and doubles.
- Array and Object lengths are available.
- Object element lookup is O(N).
- Parse tree is mutable.
Jansson
- Differentiates between integers and doubles.
- Array and Object lengths are available.
- Array access is O(1).
- Object element access is O(1) via a hash table.
- The parse tree is mutable.
Instead of "MemberBegin() - MemberEnd()" there should be perhaps "MemberEnd() - MemberBegin()" ... as alorithm for calculating rapidjson object length.