Commit e3450cac by Niels Lohmann

📈 removing more variance of the benchmarks

parent c3a610d3
#define BENCHPRESS_CONFIG_MAIN #define BENCHPRESS_CONFIG_MAIN
#include <fstream> #include <fstream>
#include <sstream>
#include <benchpress.hpp> #include <benchpress.hpp>
#include <json.hpp> #include <json.hpp>
#include <pthread.h> #include <pthread.h>
#include <thread> #include <thread>
using json = nlohmann::json;
struct StartUp struct StartUp
{ {
StartUp() StartUp()
...@@ -23,129 +26,93 @@ struct StartUp ...@@ -23,129 +26,93 @@ struct StartUp
}; };
StartUp startup; StartUp startup;
BENCHMARK("parse jeopardy.json", [](benchpress::context* ctx) enum class EMode { input, output_no_indent, output_with_indent };
{
for (size_t i = 0; i < ctx->num_iterations(); ++i)
{
ctx->stop_timer();
std::ifstream input_file("benchmarks/files/jeopardy/jeopardy.json");
nlohmann::json j;
ctx->start_timer();
j << input_file;
ctx->stop_timer();
}
})
BENCHMARK("parse canada.json", [](benchpress::context* ctx) static void bench(benchpress::context& ctx,
const std::string& in_path,
const EMode mode)
{ {
for (size_t i = 0; i < ctx->num_iterations(); ++i) // using string streams for benchmarking to factor-out cold-cache disk
// access.
std::stringstream istr;
{ {
ctx->stop_timer(); // read file into string stream
std::ifstream input_file("benchmarks/files/nativejson-benchmark/canada.json"); std::ifstream input_file(in_path);
nlohmann::json j; istr << input_file.rdbuf();
ctx->start_timer(); input_file.close();
j << input_file;
ctx->stop_timer();
}
})
BENCHMARK("parse citm_catalog.json", [](benchpress::context* ctx) // read the stream once
{ json j;
for (size_t i = 0; i < ctx->num_iterations(); ++i) j << istr;
{ // clear flags and rewind
ctx->stop_timer(); istr.clear();
std::ifstream input_file("benchmarks/files/nativejson-benchmark/citm_catalog.json"); istr.seekg(0);
nlohmann::json j;
ctx->start_timer();
j << input_file;
ctx->stop_timer();
} }
})
BENCHMARK("parse twitter.json", [](benchpress::context* ctx) switch (mode)
{
for (size_t i = 0; i < ctx->num_iterations(); ++i)
{ {
ctx->stop_timer(); // benchmarking input
std::ifstream input_file("benchmarks/files/nativejson-benchmark/twitter.json"); case EMode::input:
nlohmann::json j; {
ctx->start_timer(); ctx.reset_timer();
j << input_file;
ctx->stop_timer();
}
})
BENCHMARK("parse numbers/floats.json", [](benchpress::context* ctx) for (size_t i = 0; i < ctx.num_iterations(); ++i)
{ {
for (size_t i = 0; i < ctx->num_iterations(); ++i) // clear flags and rewind
{ istr.clear();
ctx->stop_timer(); istr.seekg(0);
std::ifstream input_file("benchmarks/files/numbers/floats.json"); json j;
nlohmann::json j; j << istr;
ctx->start_timer(); }
j << input_file;
ctx->stop_timer();
}
})
BENCHMARK("parse numbers/signed_ints.json", [](benchpress::context* ctx) break;
{ }
for (size_t i = 0; i < ctx->num_iterations(); ++i)
{
ctx->stop_timer();
std::ifstream input_file("benchmarks/files/numbers/signed_ints.json");
nlohmann::json j;
ctx->start_timer();
j << input_file;
ctx->stop_timer();
}
})
BENCHMARK("parse numbers/unsigned_ints.json", [](benchpress::context* ctx) // benchmarking output
{ case EMode::output_no_indent:
for (size_t i = 0; i < ctx->num_iterations(); ++i) case EMode::output_with_indent:
{ {
ctx->stop_timer(); // create JSON value from input
std::ifstream input_file("benchmarks/files/numbers/unsigned_ints.json"); json j;
nlohmann::json j; j << istr;
ctx->start_timer(); std::stringstream ostr;
j << input_file;
ctx->stop_timer();
}
})
BENCHMARK("dump jeopardy.json", [](benchpress::context* ctx) ctx.reset_timer();
{ for (size_t i = 0; i < ctx.num_iterations(); ++i)
std::ifstream input_file("benchmarks/files/jeopardy/jeopardy.json"); {
nlohmann::json j; if (mode == EMode::output_no_indent)
j << input_file; {
std::ofstream output_file("jeopardy.dump.json"); ostr << j;
}
else
{
ostr << std::setw(4) << j;
}
ctx->reset_timer(); // reset data
for (size_t i = 0; i < ctx->num_iterations(); ++i) ostr.str(std::string());
{ }
ctx->start_timer();
output_file << j;
ctx->stop_timer();
}
std::remove("jeopardy.dump.json"); break;
}) }
}
}
BENCHMARK("dump jeopardy.json with indent", [](benchpress::context* ctx) #define BENCHMARK_I(mode, title, in_path) \
{ BENCHMARK((title), [](benchpress::context* ctx) \
std::ifstream input_file("benchmarks/files/jeopardy/jeopardy.json"); { \
nlohmann::json j; bench(*ctx, (in_path), (mode)); \
j << input_file; })
std::ofstream output_file("jeopardy.dump.json");
ctx->reset_timer(); BENCHMARK_I(EMode::input, "parse jeopardy.json", "benchmarks/files/jeopardy/jeopardy.json");
for (size_t i = 0; i < ctx->num_iterations(); ++i) BENCHMARK_I(EMode::input, "parse canada.json", "benchmarks/files/nativejson-benchmark/canada.json");
{ BENCHMARK_I(EMode::input, "parse citm_catalog.json", "benchmarks/files/nativejson-benchmark/citm_catalog.json");
ctx->start_timer(); BENCHMARK_I(EMode::input, "parse twitter.json", "benchmarks/files/nativejson-benchmark/twitter.json");
output_file << std::setw(4) << j; BENCHMARK_I(EMode::input, "parse numbers/floats.json", "benchmarks/files/numbers/floats.json");
ctx->stop_timer(); BENCHMARK_I(EMode::input, "parse numbers/signed_ints.json", "benchmarks/files/numbers/signed_ints.json");
} BENCHMARK_I(EMode::input, "parse numbers/unsigned_ints.json", "benchmarks/files/numbers/unsigned_ints.json");
std::remove("jeopardy.dump.json"); BENCHMARK_I(EMode::output_no_indent, "dump jeopardy.json", "benchmarks/files/jeopardy/jeopardy.json");
}) BENCHMARK_I(EMode::output_with_indent, "dump jeopardy.json with indent", "benchmarks/files/jeopardy/jeopardy.json");
BENCHMARK_I(EMode::output_no_indent, "dump numbers/floats.json", "benchmarks/files/numbers/floats.json");
BENCHMARK_I(EMode::output_no_indent, "dump numbers/signed_ints.json", "benchmarks/files/numbers/signed_ints.json");
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment