mirror of
https://github.com/nlohmann/json.git
synced 2026-10-01 14:35:18 +00:00
benchmarks_view.cpp adds ViewParse, ViewRead (a reused document), ViewParseIndented, ViewAccept, and ViewMaterialize on the files of ParseString, so that each row can be read against the json::parse row of the same file; benchmarks.cpp gains Accept (json::accept) as the counterpart of ViewAccept. The view benchmarks are built only if the header directory has json_view.hpp, so that older versions can still be benchmarked. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
147 lines
5.3 KiB
C++
147 lines
5.3 KiB
C++
// __ _____ _____ _____
|
|
// __| | __| | | | JSON for Modern C++ (supporting code)
|
|
// | | |__ | | | | | | version 3.12.0
|
|
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
|
|
//
|
|
// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
// Benchmarks of json_document (nlohmann/json_view.hpp). They use the inputs of
|
|
// ParseString and ParseIndented in benchmarks.cpp, so that each ViewParse row
|
|
// can be read against the json::parse row of the same file.
|
|
|
|
#include <benchmark/benchmark.h>
|
|
#include <nlohmann/json_view.hpp>
|
|
#include <fstream>
|
|
#include <iterator>
|
|
#include <string>
|
|
#include <test_data.hpp>
|
|
|
|
using json = nlohmann::json;
|
|
using json_document = nlohmann::json_document;
|
|
|
|
static std::string read_file(const char* filename)
|
|
{
|
|
std::ifstream f(filename, std::ios::binary);
|
|
return std::string((std::istreambuf_iterator<char>(f)), std::istreambuf_iterator<char>());
|
|
}
|
|
|
|
#define JSON_VIEW_BENCHMARK_FILES(fn) \
|
|
BENCHMARK_CAPTURE(fn, jeopardy, TEST_DATA_DIRECTORY "/jeopardy/jeopardy.json"); \
|
|
BENCHMARK_CAPTURE(fn, canada, TEST_DATA_DIRECTORY "/nativejson-benchmark/canada.json"); \
|
|
BENCHMARK_CAPTURE(fn, citm_catalog, TEST_DATA_DIRECTORY "/nativejson-benchmark/citm_catalog.json"); \
|
|
BENCHMARK_CAPTURE(fn, twitter, TEST_DATA_DIRECTORY "/nativejson-benchmark/twitter.json"); \
|
|
BENCHMARK_CAPTURE(fn, floats, TEST_DATA_DIRECTORY "/regression/floats.json"); \
|
|
BENCHMARK_CAPTURE(fn, signed_ints, TEST_DATA_DIRECTORY "/regression/signed_ints.json"); \
|
|
BENCHMARK_CAPTURE(fn, unsigned_ints, TEST_DATA_DIRECTORY "/regression/unsigned_ints.json"); \
|
|
BENCHMARK_CAPTURE(fn, small_signed_ints, TEST_DATA_DIRECTORY "/regression/small_signed_ints.json")
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// parse into a new document (compare with ParseString)
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
static void ViewParse(benchmark::State& state, const char* filename)
|
|
{
|
|
const std::string str = read_file(filename);
|
|
|
|
while (state.KeepRunning())
|
|
{
|
|
state.PauseTiming();
|
|
auto* d = new json_document();
|
|
state.ResumeTiming();
|
|
|
|
*d = json_document::parse(str);
|
|
|
|
state.PauseTiming();
|
|
delete d;
|
|
state.ResumeTiming();
|
|
}
|
|
|
|
state.SetBytesProcessed(state.iterations() * str.size());
|
|
}
|
|
JSON_VIEW_BENCHMARK_FILES(ViewParse);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// parse into a document that is reused (its memory stays allocated)
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
static void ViewRead(benchmark::State& state, const char* filename)
|
|
{
|
|
const std::string str = read_file(filename);
|
|
json_document d;
|
|
|
|
while (state.KeepRunning())
|
|
{
|
|
d.read(str);
|
|
benchmark::DoNotOptimize(d);
|
|
}
|
|
|
|
state.SetBytesProcessed(state.iterations() * str.size());
|
|
}
|
|
JSON_VIEW_BENCHMARK_FILES(ViewRead);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// parse pretty-printed JSON (compare with ParseIndented)
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
static void ViewParseIndented(benchmark::State& state, const char* filename, int indent)
|
|
{
|
|
const std::string indented = json::parse(read_file(filename)).dump(indent);
|
|
json_document d;
|
|
|
|
while (state.KeepRunning())
|
|
{
|
|
d.read(indented);
|
|
benchmark::DoNotOptimize(d);
|
|
}
|
|
|
|
state.SetBytesProcessed(state.iterations() * indented.size());
|
|
}
|
|
BENCHMARK_CAPTURE(ViewParseIndented, jeopardy / 4, TEST_DATA_DIRECTORY "/jeopardy/jeopardy.json", 4);
|
|
BENCHMARK_CAPTURE(ViewParseIndented, canada / 4, TEST_DATA_DIRECTORY "/nativejson-benchmark/canada.json", 4);
|
|
BENCHMARK_CAPTURE(ViewParseIndented, citm_catalog / 4, TEST_DATA_DIRECTORY "/nativejson-benchmark/citm_catalog.json", 4);
|
|
BENCHMARK_CAPTURE(ViewParseIndented, twitter / 4, TEST_DATA_DIRECTORY "/nativejson-benchmark/twitter.json", 4);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// validate only (compare with Accept)
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
static void ViewAccept(benchmark::State& state, const char* filename)
|
|
{
|
|
const std::string str = read_file(filename);
|
|
|
|
while (state.KeepRunning())
|
|
{
|
|
benchmark::DoNotOptimize(json_document::accept(str));
|
|
}
|
|
|
|
state.SetBytesProcessed(state.iterations() * str.size());
|
|
}
|
|
JSON_VIEW_BENCHMARK_FILES(ViewAccept);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// convert a parsed document into a json value
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
static void ViewMaterialize(benchmark::State& state, const char* filename)
|
|
{
|
|
const std::string str = read_file(filename);
|
|
const json_document d = json_document::parse(str);
|
|
|
|
while (state.KeepRunning())
|
|
{
|
|
state.PauseTiming();
|
|
auto* j = new json();
|
|
state.ResumeTiming();
|
|
|
|
*j = d.root().materialize();
|
|
|
|
state.PauseTiming();
|
|
delete j;
|
|
state.ResumeTiming();
|
|
}
|
|
|
|
state.SetBytesProcessed(state.iterations() * str.size());
|
|
}
|
|
JSON_VIEW_BENCHMARK_FILES(ViewMaterialize);
|