From ed611119d99e0569a0a8d03f7a7aea11b0416497 Mon Sep 17 00:00:00 2001 From: Niels Date: Wed, 23 Nov 2016 08:47:40 +0100 Subject: [PATCH] :chart_with_upwards_trend: reducing benchmark variance (#365) --- Makefile | 2 +- benchmarks/benchmarks.cpp | 44 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 4c66fbfb..3fd6d54b 100644 --- a/Makefile +++ b/Makefile @@ -95,7 +95,7 @@ pretty: # benchmarks json_benchmarks: benchmarks/benchmarks.cpp benchmarks/benchpress.hpp benchmarks/cxxopts.hpp src/json.hpp cd benchmarks/files/numbers ; python generate.py - $(CXX) -std=c++11 $(CXXFLAGS) -DNDEBUG -O3 -flto -I src -I benchmarks $< $(LDFLAGS) -o $@ + $(CXX) -std=c++11 -pthread $(CXXFLAGS) -DNDEBUG -O3 -flto -I src -I benchmarks $< $(LDFLAGS) -o $@ ./json_benchmarks diff --git a/benchmarks/benchmarks.cpp b/benchmarks/benchmarks.cpp index ec6b462c..251481ea 100644 --- a/benchmarks/benchmarks.cpp +++ b/benchmarks/benchmarks.cpp @@ -3,14 +3,36 @@ #include #include #include +#include +#include + +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; BENCHMARK("parse jeopardy.json", [](benchpress::context* ctx) { 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(); } }) @@ -18,9 +40,12 @@ BENCHMARK("parse canada.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/canada.json"); nlohmann::json j; + ctx->start_timer(); j << input_file; + ctx->stop_timer(); } }) @@ -28,9 +53,12 @@ BENCHMARK("parse citm_catalog.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/citm_catalog.json"); nlohmann::json j; + ctx->start_timer(); j << input_file; + ctx->stop_timer(); } }) @@ -38,9 +66,12 @@ 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(); } }) @@ -48,9 +79,12 @@ 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(); } }) @@ -58,9 +92,12 @@ 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(); } }) @@ -68,9 +105,12 @@ 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(); } }) @@ -84,7 +124,9 @@ BENCHMARK("dump jeopardy.json", [](benchpress::context* ctx) 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"); @@ -100,7 +142,9 @@ BENCHMARK("dump jeopardy.json with indent", [](benchpress::context* ctx) ctx->reset_timer(); for (size_t i = 0; i < ctx->num_iterations(); ++i) { + ctx->start_timer(); output_file << std::setw(4) << j; + ctx->stop_timer(); } std::remove("jeopardy.dump.json");