From ee64e068f9810da294bf0ea81a63bf17c38020db Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Sun, 14 Jun 2020 21:12:02 +0200 Subject: [PATCH] Add bench for rapidjson --- bench/Makefile | 15 ++++ bench/bench-rapidjson.cpp | 185 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 200 insertions(+) create mode 100644 bench/bench-rapidjson.cpp diff --git a/bench/Makefile b/bench/Makefile index ef82407b..f3640a76 100644 --- a/bench/Makefile +++ b/bench/Makefile @@ -341,6 +341,21 @@ bench-rigtorp-mpmc-queue0: ############################################################################ +bench-mlib-json: bench-mlib + @./bench-mlib.exe 110 + @./bench-mlib.exe 111 + @./bench-mlib.exe 112 + +bench-rapidjson: + @if test -n "$${RAPIDJSON}" ; then $(MAKE) bench-rapidjson0 ; else echo "Nothing to be done for RAPIDJSON." ; fi +bench-rapidjson0: + $(CXX) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) -I "$${RAPIDJSON}/" bench-rapidjson.cpp common.c -o bench-rapidjson.exe + @./bench-rapidjson.exe 110 + @./bench-rapidjson.exe 111 + @./bench-rapidjson.exe 112 + +############################################################################ + bench-plain: $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) bench-plain-c.c -o bench-plain-c.exe @./bench-plain-c.exe diff --git a/bench/bench-rapidjson.cpp b/bench/bench-rapidjson.cpp new file mode 100644 index 00000000..08076641 --- /dev/null +++ b/bench/bench-rapidjson.cpp @@ -0,0 +1,185 @@ +#define NDEBUG +#define RAPIDJSON_HAS_STDSTRING 1 + +#include "rapidjson/reader.h" +#include "rapidjson/document.h" +#include "rapidjson/prettywriter.h" +#include "rapidjson/filereadstream.h" +#include "rapidjson/filewritestream.h" +#include "rapidjson/encodedstream.h" +#include "rapidjson/error/en.h" + +#include +#include +#include + +#include "common.h" + +using namespace std; + +/********************************************************************************************/ + +vector vstring; +vector vstring2; + +static void +bench_vector_string_init(size_t n) +{ + for(size_t i = 0; i < n; i++) + { + char buff[100]; + snprintf(buff, sizeof(buff), "%zu", i); + std::string s(buff); + vstring.push_back(s); + } +} + +static void +bench_vector_string_init_big(size_t n) +{ + for(size_t i = 0; i < n; i++) + { + char buff[100]; + snprintf(buff, sizeof(buff), "%zu%zu%zu%zu%zu%zu", i, i, i, i, i, i); + std::string s(buff); + vstring.push_back(s); + } +} + +static void +bench_vector_string_json_run(size_t n) +{ + if (vstring.size() != n) { + printf("Size are different!\n"); + abort(); + } + + FILE *f = fopen("tmp-serial.json", "wt"); + if (!f) abort(); + { + // Prepare writer and output stream. + char writeBuffer[65536]; + typedef rapidjson::AutoUTFOutputStream OutputStream; + rapidjson::FileWriteStream os(f, writeBuffer, sizeof(writeBuffer)); + OutputStream eos(os, rapidjson::kUTF8, false); + rapidjson::PrettyWriter, rapidjson::AutoUTF > writer(eos); + + writer.StartArray(); + for(size_t i = 0; i < n; i++){ + writer.String(vstring[i]); + } + writer.EndArray(); + } + fclose(f); + + f = fopen("tmp-serial.json", "rt"); + if (!f) abort(); + { + char readBuffer[65536]; + rapidjson::FileReadStream is(f, readBuffer, sizeof(readBuffer)); + rapidjson::Document d; + d.ParseStream(is); + for(size_t i = 0; i < d.Size(); i++) { + rapidjson::Value& s = d[i]; + vstring2.push_back(s.GetString()); + } + } + fclose(f); + + if (vstring2.size() != n) { + printf("Size are different!\n"); + abort(); + } +} + +static void +bench_vector_string_clear(void) +{ + if (vstring != vstring2) { + printf("Array are different!\n"); + abort(); + } +} + +/********************************************************************************************/ + +vector vulong; +vector vulong2; + +static void +bench_vector_ulong_init(size_t n) +{ + for(size_t i = 0; i < n; i++) + { + vulong.push_back(i*i); + } +} + +static void +bench_vector_ulong_json_run(size_t n) +{ + if (vulong.size() != n) { + printf("Size are different!\n"); + abort(); + } + + FILE *f = fopen("tmp-serial.json", "wt"); + if (!f) abort(); + { + // Prepare writer and output stream. + char writeBuffer[65536]; + typedef rapidjson::AutoUTFOutputStream OutputStream; + rapidjson::FileWriteStream os(f, writeBuffer, sizeof(writeBuffer)); + OutputStream eos(os, rapidjson::kUTF8, false); + rapidjson::PrettyWriter, rapidjson::AutoUTF > writer(eos); + + writer.StartArray(); + for(size_t i = 0; i < n; i++){ + writer.Int64(vulong[i]); + } + writer.EndArray(); + } + fclose(f); + + f = fopen("tmp-serial.json", "rt"); + if (!f) abort(); + { + char readBuffer[65536]; + rapidjson::FileReadStream is(f, readBuffer, sizeof(readBuffer)); + rapidjson::Document d; + d.ParseStream(is); + for(size_t i = 0; i < d.Size(); i++) { + rapidjson::Value& s = d[i]; + vulong2.push_back(s.GetInt64()); + } + } + fclose(f); + + if (vulong2.size() != n) { + printf("Size are different!\n"); + abort(); + } +} + +static void +bench_vector_ulong_clear(void) +{ + if (vulong != vulong2) { + printf("Array are different!\n"); + abort(); + } +} + +/********************************************************************************************/ + +const config_func_t table[] = { + {110, "serial-json STR", 10000000, bench_vector_string_init, bench_vector_string_json_run, bench_vector_string_clear}, + {111, "serial-json STR.big", 10000000, bench_vector_string_init_big, bench_vector_string_json_run, bench_vector_string_clear}, + {112, "serial-json INT", 10000000, bench_vector_ulong_init, bench_vector_ulong_json_run, bench_vector_ulong_clear} +}; + +int main(int argc, const char *argv[]) +{ + test("RAPIDJSON", numberof(table), table, argc, argv); + exit(0); +}