2015-06-02 21:57:45 +00:00
|
|
|
#define BENCHPRESS_CONFIG_MAIN
|
|
|
|
|
|
|
|
#include <fstream>
|
2016-11-24 17:24:26 +00:00
|
|
|
#include <sstream>
|
2015-06-02 21:57:45 +00:00
|
|
|
#include <benchpress.hpp>
|
|
|
|
#include <json.hpp>
|
2016-11-23 07:47:40 +00:00
|
|
|
#include <pthread.h>
|
|
|
|
#include <thread>
|
|
|
|
|
2016-11-24 17:24:26 +00:00
|
|
|
using json = nlohmann::json;
|
|
|
|
|
2016-11-23 07:47:40 +00:00
|
|
|
struct StartUp
|
|
|
|
{
|
|
|
|
StartUp()
|
|
|
|
{
|
|
|
|
#ifndef __llvm__
|
|
|
|
// pin thread to a single CPU
|
|
|
|
cpu_set_t cpuset;
|
|
|
|
pthread_t thread;
|
|
|
|
thread = pthread_self();
|
|
|
|
CPU_ZERO(&cpuset);
|
|
|
|
CPU_SET(std::thread::hardware_concurrency() - 1, &cpuset);
|
|
|
|
pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
};
|
|
|
|
StartUp startup;
|
2015-06-02 21:57:45 +00:00
|
|
|
|
2016-11-24 17:24:26 +00:00
|
|
|
enum class EMode { input, output_no_indent, output_with_indent };
|
2015-06-02 21:57:45 +00:00
|
|
|
|
2016-11-24 17:24:26 +00:00
|
|
|
static void bench(benchpress::context& ctx,
|
|
|
|
const std::string& in_path,
|
|
|
|
const EMode mode)
|
2015-06-02 21:57:45 +00:00
|
|
|
{
|
2016-11-24 17:24:26 +00:00
|
|
|
// using string streams for benchmarking to factor-out cold-cache disk
|
|
|
|
// access.
|
2017-10-07 22:50:19 +00:00
|
|
|
#if defined( FROMFILE )
|
|
|
|
std::ifstream istr;
|
|
|
|
{
|
|
|
|
istr.open( in_path, std::ifstream::in );
|
|
|
|
|
|
|
|
// read the stream once
|
|
|
|
json j;
|
|
|
|
istr >> j;
|
|
|
|
// clear flags and rewind
|
|
|
|
istr.clear();
|
|
|
|
istr.seekg(0);
|
|
|
|
}
|
|
|
|
#else
|
2016-11-24 17:24:26 +00:00
|
|
|
std::stringstream istr;
|
2015-06-02 21:57:45 +00:00
|
|
|
{
|
2016-11-24 17:24:26 +00:00
|
|
|
// read file into string stream
|
|
|
|
std::ifstream input_file(in_path);
|
|
|
|
istr << input_file.rdbuf();
|
|
|
|
input_file.close();
|
2015-06-02 21:57:45 +00:00
|
|
|
|
2016-11-24 17:24:26 +00:00
|
|
|
// read the stream once
|
|
|
|
json j;
|
2017-10-07 22:50:19 +00:00
|
|
|
istr >> j;
|
2016-11-24 17:24:26 +00:00
|
|
|
// clear flags and rewind
|
|
|
|
istr.clear();
|
|
|
|
istr.seekg(0);
|
2015-06-02 21:57:45 +00:00
|
|
|
}
|
2017-10-07 22:50:19 +00:00
|
|
|
#endif
|
2015-06-02 21:57:45 +00:00
|
|
|
|
2016-11-24 17:24:26 +00:00
|
|
|
switch (mode)
|
2015-06-02 21:57:45 +00:00
|
|
|
{
|
2016-11-24 17:24:26 +00:00
|
|
|
// benchmarking input
|
|
|
|
case EMode::input:
|
|
|
|
{
|
|
|
|
ctx.reset_timer();
|
2015-06-02 21:57:45 +00:00
|
|
|
|
2016-11-24 17:24:26 +00:00
|
|
|
for (size_t i = 0; i < ctx.num_iterations(); ++i)
|
|
|
|
{
|
2016-11-24 20:54:05 +00:00
|
|
|
// clear flags and rewind
|
2016-11-24 17:24:26 +00:00
|
|
|
istr.clear();
|
|
|
|
istr.seekg(0);
|
|
|
|
json j;
|
2017-10-07 22:50:19 +00:00
|
|
|
istr >> j;
|
2016-11-24 17:24:26 +00:00
|
|
|
}
|
2016-07-20 21:06:45 +00:00
|
|
|
|
2016-11-24 17:24:26 +00:00
|
|
|
break;
|
|
|
|
}
|
2016-07-20 21:06:45 +00:00
|
|
|
|
2016-11-24 17:24:26 +00:00
|
|
|
// benchmarking output
|
|
|
|
case EMode::output_no_indent:
|
|
|
|
case EMode::output_with_indent:
|
|
|
|
{
|
|
|
|
// create JSON value from input
|
|
|
|
json j;
|
2017-10-07 22:50:19 +00:00
|
|
|
istr >> j;
|
2016-11-24 17:24:26 +00:00
|
|
|
std::stringstream ostr;
|
2016-07-20 21:06:45 +00:00
|
|
|
|
2016-11-24 17:24:26 +00:00
|
|
|
ctx.reset_timer();
|
|
|
|
for (size_t i = 0; i < ctx.num_iterations(); ++i)
|
|
|
|
{
|
|
|
|
if (mode == EMode::output_no_indent)
|
|
|
|
{
|
|
|
|
ostr << j;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ostr << std::setw(4) << j;
|
|
|
|
}
|
2015-06-02 21:57:45 +00:00
|
|
|
|
2016-11-24 17:24:26 +00:00
|
|
|
// reset data
|
|
|
|
ostr.str(std::string());
|
|
|
|
}
|
2015-06-03 21:34:10 +00:00
|
|
|
|
2016-11-24 17:24:26 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-06-02 21:57:45 +00:00
|
|
|
|
2016-11-24 17:24:26 +00:00
|
|
|
#define BENCHMARK_I(mode, title, in_path) \
|
|
|
|
BENCHMARK((title), [](benchpress::context* ctx) \
|
|
|
|
{ \
|
|
|
|
bench(*ctx, (in_path), (mode)); \
|
|
|
|
})
|
2015-06-02 21:57:45 +00:00
|
|
|
|
2017-10-04 17:27:35 +00:00
|
|
|
BENCHMARK_I(EMode::input, "parse jeopardy.json", "files/jeopardy/jeopardy.json");
|
|
|
|
BENCHMARK_I(EMode::input, "parse canada.json", "files/nativejson-benchmark/canada.json");
|
|
|
|
BENCHMARK_I(EMode::input, "parse citm_catalog.json", "files/nativejson-benchmark/citm_catalog.json");
|
|
|
|
BENCHMARK_I(EMode::input, "parse twitter.json", "files/nativejson-benchmark/twitter.json");
|
|
|
|
BENCHMARK_I(EMode::input, "parse numbers/floats.json", "files/numbers/floats.json");
|
|
|
|
BENCHMARK_I(EMode::input, "parse numbers/signed_ints.json", "files/numbers/signed_ints.json");
|
|
|
|
BENCHMARK_I(EMode::input, "parse numbers/unsigned_ints.json", "files/numbers/unsigned_ints.json");
|
|
|
|
|
|
|
|
BENCHMARK_I(EMode::output_no_indent, "dump jeopardy.json", "files/jeopardy/jeopardy.json");
|
|
|
|
BENCHMARK_I(EMode::output_with_indent, "dump jeopardy.json with indent", "files/jeopardy/jeopardy.json");
|
|
|
|
BENCHMARK_I(EMode::output_no_indent, "dump numbers/floats.json", "files/numbers/floats.json");
|
|
|
|
BENCHMARK_I(EMode::output_no_indent, "dump numbers/signed_ints.json", "files/numbers/signed_ints.json");
|