diff --git a/tests/benchmarks/src/benchmarks.cpp b/tests/benchmarks/src/benchmarks.cpp index 5df7dd473..b0511accc 100644 --- a/tests/benchmarks/src/benchmarks.cpp +++ b/tests/benchmarks/src/benchmarks.cpp @@ -8,7 +8,9 @@ #include #include +#include #include +#include #include #include #include @@ -48,6 +50,65 @@ BENCHMARK_CAPTURE(ParseFile, signed_ints, TEST_DATA_DIRECTORY "/regression BENCHMARK_CAPTURE(ParseFile, unsigned_ints, TEST_DATA_DIRECTORY "/regression/unsigned_ints.json"); BENCHMARK_CAPTURE(ParseFile, small_signed_ints, TEST_DATA_DIRECTORY "/regression/small_signed_ints.json"); +////////////////////////////////////////////////////////////////////////////// +// parse JSON from a FILE* +////////////////////////////////////////////////////////////////////////////// + +static void ParseFILE(benchmark::State& state, const char* filename) +{ + while (state.KeepRunning()) + { + state.PauseTiming(); + std::FILE* f = std::fopen(filename, "rb"); + auto* j = new json(); + state.ResumeTiming(); + + *j = json::parse(f); + + state.PauseTiming(); + std::fclose(f); + delete j; + state.ResumeTiming(); + } + + std::ifstream file(filename, std::ios::binary | std::ios::ate); + state.SetBytesProcessed(state.iterations() * file.tellg()); +} +BENCHMARK_CAPTURE(ParseFILE, canada, TEST_DATA_DIRECTORY "/nativejson-benchmark/canada.json"); +BENCHMARK_CAPTURE(ParseFILE, citm_catalog, TEST_DATA_DIRECTORY "/nativejson-benchmark/citm_catalog.json"); +BENCHMARK_CAPTURE(ParseFILE, twitter, TEST_DATA_DIRECTORY "/nativejson-benchmark/twitter.json"); + +////////////////////////////////////////////////////////////////////////////// +// read many small values from one stream (NDJSON) +////////////////////////////////////////////////////////////////////////////// + +static void ParseStreamValues(benchmark::State& state, bool numbers) +{ + std::string input; + for (int i = 0; i < 10000; ++i) + { + input += numbers ? std::to_string(i * 7919) + " " + : R"({"id":)" + std::to_string(i) + R"(,"name":"user)" + std::to_string(i) + R"(","active":true,"score":)" + std::to_string(i * 0.25) + "}\n"; + } + + for (auto _ : state) + { + std::istringstream is(input); + json j; + std::size_t count = 0; + while (!(is >> std::ws).eof()) + { + is >> j; + ++count; + } + benchmark::DoNotOptimize(count); + } + + state.SetBytesProcessed(static_cast(state.iterations() * input.size())); +} +BENCHMARK_CAPTURE(ParseStreamValues, ndjson, false); +BENCHMARK_CAPTURE(ParseStreamValues, numbers, true); + ////////////////////////////////////////////////////////////////////////////// // parse JSON from string //////////////////////////////////////////////////////////////////////////////