//// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) Copyright (c) 2025 Dmitry Arkhipov (grisumbras@yandex.ru) Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Official repository: https://github.com/boostorg/json //// [pagelevels=1,toclevels=1] = Benchmarks 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: .Implementations |=== |Name|Description | *boost(pool)* | Parses the input using a <>, which is optimized for parsing without subsequent modification. The <> object is reused between trials, allowing temporary memory allocated by the implementation to persist and improve performance. | *boost* | Parses the input using the <>, which uses the standard C++ allocator, and is designed for general use including mutation of the document after it is parsed. The <> object is reused between trials, allowing temporary memory allocated by the implementation to persist and improve performance. | *rapidjson(pool)* | Parses the input using an instance of https://rapidjson.org/classrapidjson_1_1_memory_pool_allocator.html[`MemoryPoolAllocator`], which is optimized for parsing without subsequent modification. The https://rapidjson.org/classrapidjson_1_1_generic_document.html[`Document`] object holding temporary memory is not reused between trials, otherwise memory consumption grows without bounds and invalidates the benchmark. | *rapidjson* | Parses the input using an instance of https://rapidjson.org/classrapidjson_1_1_crt_allocator.html[`CrtAllocator`], which uses the standard C++ allocator, and is designed for general use including mutation of the document after it is parsed. The https://rapidjson.org/classrapidjson_1_1_generic_document.html[`Document`] object holding temporary memory is not reused between trials, otherwise memory consumption grows without bounds and invalidates the benchmark. | *nlohmann* | Parses the input using the static member function https://nlohmann.github.io/json/classnlohmann_1_1basic__json_ab330c13ba254ea41fbc1c52c5c610f45.html[`json::parse`], which uses the default `std` allocator, and is designed for general use including mutation of the document after it is parsed. This library does not provide an interface to reuse temporary storage used during parsing or serialization on subsequent operations. |=== == Methodology 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: .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). == Parsing === Parse apache_builds.json image::images/parse_apache_builds.png[width=668,align="left"] === Parse canada.json image::images/parse_canada.png[width=668,align="left"] === Parse citm_catalog.json image::images/parse_citm_catalog.png[width=668,align="left"] === Parse github_events.json image::images/parse_github_events.png[width=668,align="left"] === Parse gsoc-2018.json image::images/parse_gsoc_2018.png[width=668,align="left"] === Parse instruments.json image::images/parse_instruments.png[width=668,align="left"] === Parse marine_ik.json image::images/parse_marine_ik.png[width=668,align="left"] === Parse mesh.json image::images/parse_mesh.png[width=668,align="left"] === Parse mesh.pretty.json image::images/parse_mesh_pretty.png[width=668,align="left"] === Parse numbers.json image::images/parse_numbers.png[width=668,align="left"] === Parse random.json image::images/parse_random.png[width=668,align="left"] === Parse twitter.json image::images/parse_twitter.png[width=668,align="left"] === Parse twitterescaped.json image::images/parse_twitterescaped.png[width=668,align="left"] === Parse update-center.json image::images/parse_update_center.png[width=668,align="left"] == Serialization === Serialize canada.json image::images/serialize_canada.png[width=668,align="left"] === Serialize citm_catalog.json image::images/serialize_citm_catalog.png[width=668,align="left"] === Serialize github_events.json image::images/serialize_github_events.png[width=668,align="left"] === Serialize gsoc-2018.json image::images/serialize_gsoc_2018.png[width=668,align="left"] === Serialize instruments.json image::images/serialize_instruments.png[width=668,align="left"] === Serialize marine_ik.json image::images/serialize_marine_ik.png[width=668,align="left"] === Serialize mesh.json image::images/serialize_mesh.png[width=668,align="left"] === Serialize mesh.pretty.json image::images/serialize_mesh_pretty.png[width=668,align="left"] === Serialize numbers.json image::images/serialize_numbers.png[width=668,align="left"] === Serialize random.json image::images/serialize_random.png[width=668,align="left"] === Serialize twitter.json image::images/serialize_twitter.png[width=668,align="left"] === Serialize twitterescaped.json image::images/serialize_twitterescaped.png[width=668,align="left"] === Serialize update-center.json image::images/serialize_update_center.png[width=668,align="left"]