boost/libs/json/doc/html/json/benchmarks.html
2021-10-05 21:37:46 +02:00

670 lines
26 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Benchmarks</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../index.html" title="Chapter 1. Boost.JSON">
<link rel="up" href="../index.html" title="Chapter 1. Boost.JSON">
<link rel="prev" href="frequently_asked_questions.html" title="Frequently Asked Questions">
<link rel="next" href="comparison.html" title="Comparison to Other Libraries">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
<td align="center"><a href="../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="frequently_asked_questions.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="comparison.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="json.benchmarks"></a><a class="link" href="benchmarks.html" title="Benchmarks">Benchmarks</a>
</h2></div></div></div>
<p>
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:
</p>
<div class="table">
<a name="json.benchmarks.implementations"></a><p class="title"><b>Table 1.10. Implementations</b></p>
<div class="table-contents"><table class="table" summary="Implementations">
<colgroup>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Name
</p>
</th>
<th>
<p>
Description
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<span class="bold"><strong>boost(pool)</strong></span>
</p>
</td>
<td>
<p>
Parses the input using a <a class="link" href="ref/boost__json__monotonic_resource.html" title="monotonic_resource"><code class="computeroutput"><span class="identifier">monotonic_resource</span></code></a>, which
is optimized for parsing without subsequent modification. The <a class="link" href="ref/boost__json__stream_parser.html" title="stream_parser"><code class="computeroutput"><span class="identifier">stream_parser</span></code></a>
object is reused between trials, allowing temporary memory allocated
by the implementation to persist and improve performance.
</p>
</td>
</tr>
<tr>
<td>
<p>
<span class="bold"><strong>boost</strong></span>
</p>
</td>
<td>
<p>
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 <a class="link" href="ref/boost__json__stream_parser.html" title="stream_parser"><code class="computeroutput"><span class="identifier">stream_parser</span></code></a> object is
reused between trials, allowing temporary memory allocated by the
implementation to persist and improve performance.
</p>
</td>
</tr>
<tr>
<td>
<p>
<span class="bold"><strong>rapidjson(pool)</strong></span>
</p>
</td>
<td>
<p>
Parses the input using an instance of <a href="https://rapidjson.org/classrapidjson_1_1_memory_pool_allocator.html" target="_top"><code class="computeroutput"><span class="identifier">MemoryPoolAllocator</span></code></a>, which
is optimized for parsing without subsequent modification. The <a href="https://rapidjson.org/classrapidjson_1_1_generic_document.html" target="_top"><code class="computeroutput"><span class="identifier">Document</span></code></a> object holding
temporary memory is not reused between trials, otherwise memory consumption
grows without bounds and invalidates the benchmark.
</p>
</td>
</tr>
<tr>
<td>
<p>
<span class="bold"><strong>rapidjson</strong></span>
</p>
</td>
<td>
<p>
Parses the input using an instance of <a href="https://rapidjson.org/classrapidjson_1_1_crt_allocator.html" target="_top"><code class="computeroutput"><span class="identifier">CrtAllocator</span></code></a>, which uses
the standard C++ allocator, and is designed for general use including
mutation of the document after it is parsed. The <a href="https://rapidjson.org/classrapidjson_1_1_generic_document.html" target="_top"><code class="computeroutput"><span class="identifier">Document</span></code></a> object holding
temporary memory is not reused between trials, otherwise memory consumption
grows without bounds and invalidates the benchmark.
</p>
</td>
</tr>
<tr>
<td>
<p>
<span class="bold"><strong>nlohmann</strong></span>
</p>
</td>
<td>
<p>
Parses the input using the static member function <a href="https://nlohmann.github.io/json/classnlohmann_1_1basic__json_ab330c13ba254ea41fbc1c52c5c610f45.html" target="_top"><code class="computeroutput"><span class="identifier">json</span><span class="special">::</span><span class="identifier">parse</span></code></a>, which uses the default
<code class="computeroutput"><span class="identifier">std</span></code> 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.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><h4>
<a name="json.benchmarks.h0"></a>
<span class="phrase"><a name="json.benchmarks.methodology"></a></span><a class="link" href="benchmarks.html#json.benchmarks.methodology">Methodology</a>
</h4>
<p>
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.
</p>
<p>
The input files, available in the bench/data directory, are laid out thusly:
</p>
<div class="table">
<a name="json.benchmarks.input_files"></a><p class="title"><b>Table 1.11. Input Files</b></p>
<div class="table-contents"><table class="table" summary="Input Files">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Name
</p>
</th>
<th>
<p>
Size
</p>
</th>
<th>
<p>
Description
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<a class="link" href="benchmarks.html#json.benchmarks.parse_apache_builds_json"><span class="bold"><strong>apache_builds.json</strong></span></a>
</p>
</td>
<td>
<p>
125KB
</p>
</td>
<td>
<p>
Data from the Apache Jenkins installation.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="benchmarks.html#json.benchmarks.parse_canada_json"><span class="bold"><strong>canada.json</strong></span></a>
</p>
</td>
<td>
<p>
2.2MB
</p>
</td>
<td>
<p>
The largest file, containing a large number of 2-element arrays holding
floating-point coordinate pairs.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="benchmarks.html#json.benchmarks.parse_citm_catalog_json"><span class="bold"><strong>citm_catalog.json</strong></span></a>
</p>
</td>
<td>
<p>
1.69MB
</p>
</td>
<td>
<p>
A large JSON with a variety of nesting, types, and lengths.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="benchmarks.html#json.benchmarks.parse_github_events_json"><span class="bold"><strong>github_events.json</strong></span></a>
</p>
</td>
<td>
<p>
64KB
</p>
</td>
<td>
<p>
An export of data from the Github Events API.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="benchmarks.html#json.benchmarks.parse_gsoc_2018_json"><span class="bold"><strong>gsoc-2018.json</strong></span></a>
</p>
</td>
<td>
<p>
3.25MB
</p>
</td>
<td>
<p>
Google Summer of Code 2018 data.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="benchmarks.html#json.benchmarks.parse_instruments_json"><span class="bold"><strong>instruments.json</strong></span></a>
</p>
</td>
<td>
<p>
216KB
</p>
</td>
<td>
<p>
An array of large objects.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="benchmarks.html#json.benchmarks.parse_marine_ik_json"><span class="bold"><strong>marine_ik.json</strong></span></a>
</p>
</td>
<td>
<p>
2.91MB
</p>
</td>
<td>
<p>
A three.js example model serialized to JSON.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="benchmarks.html#json.benchmarks.parse_mesh_json"><span class="bold"><strong>mesh.json</strong></span></a>
</p>
</td>
<td>
<p>
707KB
</p>
</td>
<td>
<p>
A JSON representing a 3D mesh. Contains many floating-point numbers.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="benchmarks.html#json.benchmarks.parse_mesh_pretty_json"><span class="bold"><strong>mesh.pretty.json</strong></span></a>
</p>
</td>
<td>
<p>
1.54MB
</p>
</td>
<td>
<p>
mesh.json with whitespace added.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="benchmarks.html#json.benchmarks.parse_numbers_json"><span class="bold"><strong>numbers.json</strong></span></a>
</p>
</td>
<td>
<p>
147KB
</p>
</td>
<td>
<p>
A array containing only floating-point numbers.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="benchmarks.html#json.benchmarks.parse_random_json"><span class="bold"><strong>random.json</strong></span></a>
</p>
</td>
<td>
<p>
499KB
</p>
</td>
<td>
<p>
A JSON with lots of Cyrillic characters.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="benchmarks.html#json.benchmarks.parse_twitter_json"><span class="bold"><strong>twitter.json</strong></span></a>
</p>
</td>
<td>
<p>
617KB
</p>
</td>
<td>
<p>
An export of data from Twitter's API.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="benchmarks.html#json.benchmarks.parse_twitterescaped_json"><span class="bold"><strong>twitterescaped.json</strong></span></a>
</p>
</td>
<td>
<p>
550KB
</p>
</td>
<td>
<p>
twitter.json with whitespace removed and non-ASCII characters replaced
with Unicode escapes.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a class="link" href="benchmarks.html#json.benchmarks.parse_update_center_json"><span class="bold"><strong>update-center.json</strong></span></a>
</p>
</td>
<td>
<p>
521KB
</p>
</td>
<td>
<p>
An export of data from Twitter's API.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><p>
Hardware used for testing: <span class="bold"><strong>Intel(R) Core(TM) i7-7700K
CPU @ 4.20GHz</strong></span>, Windows 10, 32GB RAM.
</p>
<p>
Compilers and optimization flags: gcc 8.1 (-O3), clang 12.0 (-O3), and msvc
19.26 (/O2).
</p>
<h4>
<a name="json.benchmarks.h1"></a>
<span class="phrase"><a name="json.benchmarks.parse_apache_builds_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_apache_builds_json">Parse
apache_builds.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_apache_builds.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h2"></a>
<span class="phrase"><a name="json.benchmarks.parse_canada_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_canada_json">Parse
canada.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_canada.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h3"></a>
<span class="phrase"><a name="json.benchmarks.parse_citm_catalog_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_citm_catalog_json">Parse
citm_catalog.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_citm_catalog.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h4"></a>
<span class="phrase"><a name="json.benchmarks.parse_github_events_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_github_events_json">Parse
github_events.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_github_events.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h5"></a>
<span class="phrase"><a name="json.benchmarks.parse_gsoc_2018_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_gsoc_2018_json">Parse
gsoc-2018.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_gsoc_2018.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h6"></a>
<span class="phrase"><a name="json.benchmarks.parse_instruments_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_instruments_json">Parse
instruments.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_instruments.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h7"></a>
<span class="phrase"><a name="json.benchmarks.parse_marine_ik_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_marine_ik_json">Parse
marine_ik.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_marine_ik.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h8"></a>
<span class="phrase"><a name="json.benchmarks.parse_mesh_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_mesh_json">Parse
mesh.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_mesh.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h9"></a>
<span class="phrase"><a name="json.benchmarks.parse_mesh_pretty_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_mesh_pretty_json">Parse
mesh.pretty.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_mesh_pretty.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h10"></a>
<span class="phrase"><a name="json.benchmarks.parse_numbers_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_numbers_json">Parse
numbers.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_numbers.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h11"></a>
<span class="phrase"><a name="json.benchmarks.parse_random_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_random_json">Parse
random.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_random.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h12"></a>
<span class="phrase"><a name="json.benchmarks.parse_twitter_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_twitter_json">Parse
twitter.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_twitter.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h13"></a>
<span class="phrase"><a name="json.benchmarks.parse_twitterescaped_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_twitterescaped_json">Parse
twitterescaped.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_twitterescaped.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h14"></a>
<span class="phrase"><a name="json.benchmarks.parse_update_center_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_update_center_json">Parse
update-center.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_update_center.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h15"></a>
<span class="phrase"><a name="json.benchmarks.parse_apache_builds_json0"></a></span><a class="link" href="benchmarks.html#json.benchmarks.parse_apache_builds_json0">Parse
apache_builds.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/parse_apache_builds.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h16"></a>
<span class="phrase"><a name="json.benchmarks.serialize_canada_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.serialize_canada_json">Serialize
canada.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/serialize_canada.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h17"></a>
<span class="phrase"><a name="json.benchmarks.serialize_citm_catalog_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.serialize_citm_catalog_json">Serialize
citm_catalog.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/serialize_citm_catalog.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h18"></a>
<span class="phrase"><a name="json.benchmarks.serialize_github_events_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.serialize_github_events_json">Serialize
github_events.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/serialize_github_events.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h19"></a>
<span class="phrase"><a name="json.benchmarks.serialize_gsoc_2018_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.serialize_gsoc_2018_json">Serialize
gsoc-2018.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/serialize_gsoc_2018.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h20"></a>
<span class="phrase"><a name="json.benchmarks.serialize_instruments_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.serialize_instruments_json">Serialize
instruments.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/serialize_instruments.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h21"></a>
<span class="phrase"><a name="json.benchmarks.serialize_marine_ik_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.serialize_marine_ik_json">Serialize
marine_ik.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/serialize_marine_ik.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h22"></a>
<span class="phrase"><a name="json.benchmarks.serialize_mesh_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.serialize_mesh_json">Serialize
mesh.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/serialize_mesh.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h23"></a>
<span class="phrase"><a name="json.benchmarks.serialize_mesh_pretty_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.serialize_mesh_pretty_json">Serialize
mesh.pretty.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/serialize_mesh_pretty.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h24"></a>
<span class="phrase"><a name="json.benchmarks.serialize_numbers_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.serialize_numbers_json">Serialize
numbers.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/serialize_numbers.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h25"></a>
<span class="phrase"><a name="json.benchmarks.serialize_random_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.serialize_random_json">Serialize
random.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/serialize_random.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h26"></a>
<span class="phrase"><a name="json.benchmarks.serialize_twitter_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.serialize_twitter_json">Serialize
twitter.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/serialize_twitter.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h27"></a>
<span class="phrase"><a name="json.benchmarks.serialize_twitterescaped_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.serialize_twitterescaped_json">Serialize
twitterescaped.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/serialize_twitterescaped.png" width="668"></span>
</p>
<h4>
<a name="json.benchmarks.h28"></a>
<span class="phrase"><a name="json.benchmarks.serialize_update_center_json"></a></span><a class="link" href="benchmarks.html#json.benchmarks.serialize_update_center_json">Serialize
update-center.json</a>
</h4>
<p>
<span class="inlinemediaobject"><img src="images/serialize_update_center.png" width="668"></span>
</p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2019, 2020 Vinnie Falco<br>Copyright © 2020 Krystian Stasiowski<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="frequently_asked_questions.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="comparison.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>