Merge branch 'develop' into feature/issue365
This commit is contained in:
commit
4bd3b1b0ef
3 changed files with 93 additions and 122 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -14,3 +14,7 @@ doc/html
|
||||||
me.nlohmann.json.docset
|
me.nlohmann.json.docset
|
||||||
|
|
||||||
benchmarks/files/numbers/*.json
|
benchmarks/files/numbers/*.json
|
||||||
|
|
||||||
|
.idea
|
||||||
|
cmake-build-debug
|
||||||
|
|
||||||
|
|
|
@ -84,22 +84,22 @@ matrix:
|
||||||
# Coverity (only for branch coverity_scan)
|
# Coverity (only for branch coverity_scan)
|
||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
compiler: gcc
|
compiler: clang
|
||||||
before_install: echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt
|
before_install: echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
sources: ['ubuntu-toolchain-r-test']
|
||||||
packages: ['g++-5', 'valgrind']
|
packages: ['valgrind']
|
||||||
coverity_scan:
|
coverity_scan:
|
||||||
project:
|
project:
|
||||||
name: "nlohmann/json"
|
name: "nlohmann/json"
|
||||||
description: "Build submitted via Travis CI"
|
description: "Build submitted via Travis CI"
|
||||||
notification_email: niels.lohmann@gmail.com
|
notification_email: niels.lohmann@gmail.com
|
||||||
build_command_prepend: "make clean ; sudo cp $(which g++-5) $(which g++)"
|
build_command_prepend: "make clean"
|
||||||
build_command: "make"
|
build_command: "make"
|
||||||
branch_pattern: coverity_scan
|
branch_pattern: coverity_scan
|
||||||
env:
|
env:
|
||||||
- COMPILER=g++-5
|
- LLVM_VERSION=3.6.0
|
||||||
- SPECIAL=coverity
|
- SPECIAL=coverity
|
||||||
|
|
||||||
# OSX / Clang
|
# OSX / Clang
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
#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
|
||||||
};
|
};
|
||||||
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)
|
|
||||||
{
|
|
||||||
for (size_t i = 0; i < ctx->num_iterations(); ++i)
|
|
||||||
{
|
|
||||||
ctx->stop_timer();
|
|
||||||
std::ifstream input_file("benchmarks/files/nativejson-benchmark/twitter.json");
|
|
||||||
nlohmann::json j;
|
|
||||||
ctx->start_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)
|
|
||||||
{
|
|
||||||
ctx->stop_timer();
|
|
||||||
std::ifstream input_file("benchmarks/files/numbers/floats.json");
|
|
||||||
nlohmann::json j;
|
|
||||||
ctx->start_timer();
|
|
||||||
j << input_file;
|
|
||||||
ctx->stop_timer();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
BENCHMARK("parse numbers/signed_ints.json", [](benchpress::context* ctx)
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
for (size_t i = 0; i < ctx->num_iterations(); ++i)
|
|
||||||
{
|
|
||||||
ctx->stop_timer();
|
|
||||||
std::ifstream input_file("benchmarks/files/numbers/unsigned_ints.json");
|
|
||||||
nlohmann::json j;
|
|
||||||
ctx->start_timer();
|
|
||||||
j << input_file;
|
|
||||||
ctx->stop_timer();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
BENCHMARK("dump jeopardy.json", [](benchpress::context* ctx)
|
|
||||||
{
|
|
||||||
std::ifstream input_file("benchmarks/files/jeopardy/jeopardy.json");
|
|
||||||
nlohmann::json j;
|
|
||||||
j << input_file;
|
|
||||||
std::ofstream output_file("jeopardy.dump.json");
|
|
||||||
|
|
||||||
ctx->reset_timer();
|
|
||||||
for (size_t i = 0; i < ctx->num_iterations(); ++i)
|
|
||||||
{
|
|
||||||
ctx->start_timer();
|
|
||||||
output_file << j;
|
|
||||||
ctx->stop_timer();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::remove("jeopardy.dump.json");
|
switch (mode)
|
||||||
})
|
|
||||||
|
|
||||||
BENCHMARK("dump jeopardy.json with indent", [](benchpress::context* ctx)
|
|
||||||
{
|
|
||||||
std::ifstream input_file("benchmarks/files/jeopardy/jeopardy.json");
|
|
||||||
nlohmann::json j;
|
|
||||||
j << input_file;
|
|
||||||
std::ofstream output_file("jeopardy.dump.json");
|
|
||||||
|
|
||||||
ctx->reset_timer();
|
|
||||||
for (size_t i = 0; i < ctx->num_iterations(); ++i)
|
|
||||||
{
|
{
|
||||||
ctx->start_timer();
|
// benchmarking input
|
||||||
output_file << std::setw(4) << j;
|
case EMode::input:
|
||||||
ctx->stop_timer();
|
{
|
||||||
|
ctx.reset_timer();
|
||||||
|
|
||||||
|
for (size_t i = 0; i < ctx.num_iterations(); ++i)
|
||||||
|
{
|
||||||
|
// clear flags and rewind
|
||||||
|
istr.clear();
|
||||||
|
istr.seekg(0);
|
||||||
|
json j;
|
||||||
|
j << istr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::remove("jeopardy.dump.json");
|
break;
|
||||||
})
|
}
|
||||||
|
|
||||||
|
// benchmarking output
|
||||||
|
case EMode::output_no_indent:
|
||||||
|
case EMode::output_with_indent:
|
||||||
|
{
|
||||||
|
// create JSON value from input
|
||||||
|
json j;
|
||||||
|
j << istr;
|
||||||
|
std::stringstream ostr;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset data
|
||||||
|
ostr.str(std::string());
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define BENCHMARK_I(mode, title, in_path) \
|
||||||
|
BENCHMARK((title), [](benchpress::context* ctx) \
|
||||||
|
{ \
|
||||||
|
bench(*ctx, (in_path), (mode)); \
|
||||||
|
})
|
||||||
|
|
||||||
|
BENCHMARK_I(EMode::input, "parse jeopardy.json", "benchmarks/files/jeopardy/jeopardy.json");
|
||||||
|
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");
|
||||||
|
BENCHMARK_I(EMode::input, "parse twitter.json", "benchmarks/files/nativejson-benchmark/twitter.json");
|
||||||
|
BENCHMARK_I(EMode::input, "parse numbers/floats.json", "benchmarks/files/numbers/floats.json");
|
||||||
|
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");
|
||||||
|
|
||||||
|
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");
|
||||||
|
|
Loading…
Reference in a new issue