...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
This section compares the performance of Boost.JSON with two widely used libraries with similar functionality: RapidJSON which is known for its performance, and JSON for Modern C++ which is known for feature-richness. The bench program measures the throughput of parsing and serialization for the a set of JSON representing typical workloads. These implementations are evaluated:
Table 1.10. Implementations
Name |
Description |
---|---|
boost(pool) |
Parses the input using a |
boost |
Parses the input using the default memory resource, which uses the
standard C++ allocator, and is designed for general use including
mutation of the document after it is parsed. The |
rapidjson(pool) |
Parses the input using an instance of |
rapidjson |
Parses the input using an instance of |
nlohmann |
Parses the input using the static member function |
The input files are all loaded first. Then each configuration is run for a sufficient number of trials to last at least 5 seconds. The elapsed time, number of invocations (of parse or serialize), and bytes transferred are emitted as a sample along with a calculation of throughput expressed in megabytes per second. Several samples (currently five) are generated for each configuration. All but the median two samples are discarded, with the remaining samples averaged to produce a single number which is reported as the benchmark result.
The input files, available in the bench/data directory, are laid out thusly:
Table 1.11. Input Files
Name |
Size |
Description |
---|---|---|
125KB |
Data from the Apache Jenkins installation. |
|
2.2MB |
The largest file, containing a large number of 2-element arrays holding floating-point coordinate pairs. |
|
1.69MB |
A large JSON with a variety of nesting, types, and lengths. |
|
64KB |
An export of data from the Github Events API. |
|
3.25MB |
Google Summer of Code 2018 data. |
|
216KB |
An array of large objects. |
|
2.91MB |
A three.js example model serialized to JSON. |
|
707KB |
A JSON representing a 3D mesh. Contains many floating-point numbers. |
|
1.54MB |
mesh.json with whitespace added. |
|
147KB |
A array containing only floating-point numbers. |
|
499KB |
A JSON with lots of Cyrillic characters. |
|
617KB |
An export of data from Twitter's API. |
|
550KB |
twitter.json with whitespace removed and non-ASCII characters replaced with Unicode escapes. |
|
521KB |
An export of data from Twitter's API. |
Hardware used for testing: Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz, Windows 10, 32GB RAM.
Compilers and optimization flags: gcc 8.1 (-O3), clang 12.0 (-O3), and msvc 19.26 (/O2).