aboutsummaryrefslogtreecommitdiff
path: root/src/benchmark/benchmark_serialize.cpp
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2022-05-17 22:12:00 +0200
committerElias Fleckenstein <eliasfleckenstein@web.de>2022-05-17 22:12:00 +0200
commit21df26984da91143c15587f5a03c98d68c3adc4e (patch)
treeaaa707a628ad331f67890023dffe1b4f60dd01d3 /src/benchmark/benchmark_serialize.cpp
parentb09fc5de5cdb021f43ad32b7e3f50dc75c0bc622 (diff)
parenteabf05758e3ba5f6f4bb1b8d1d1f02179b84e410 (diff)
downloaddragonfireclient-21df26984da91143c15587f5a03c98d68c3adc4e.tar.xz
Merge branch 'master' of https://github.com/minetest/minetest
Diffstat (limited to 'src/benchmark/benchmark_serialize.cpp')
-rw-r--r--src/benchmark/benchmark_serialize.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/benchmark/benchmark_serialize.cpp b/src/benchmark/benchmark_serialize.cpp
new file mode 100644
index 000000000..97cc7d59d
--- /dev/null
+++ b/src/benchmark/benchmark_serialize.cpp
@@ -0,0 +1,71 @@
+/*
+Minetest
+Copyright (C) 2022 Minetest Authors
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "benchmark_setup.h"
+#include "util/serialize.h"
+#include <sstream>
+#include <ios>
+
+// Builds a string of exactly `length` characters by repeating `s` (rest cut off)
+static std::string makeRepeatTo(const std::string &s, size_t length)
+{
+ std::string v;
+ v.reserve(length + s.size());
+ for (size_t i = 0; i < length; i += s.size()) {
+ v += s;
+ }
+ v.resize(length);
+ return v;
+}
+
+#define BENCH3(_label, _chars, _length, _lengthlabel) \
+ BENCHMARK_ADVANCED("serializeJsonStringIfNeeded_" _lengthlabel "_" _label)(Catch::Benchmark::Chronometer meter) { \
+ std::string s = makeRepeatTo(_chars, _length); \
+ meter.measure([&] { return serializeJsonStringIfNeeded(s); }); \
+ }; \
+ BENCHMARK_ADVANCED("deSerializeJsonStringIfNeeded_" _lengthlabel "_" _label)(Catch::Benchmark::Chronometer meter) { \
+ std::string s = makeRepeatTo(_chars, _length); \
+ std::string serialized = serializeJsonStringIfNeeded(s); \
+ std::istringstream is(serialized, std::ios::binary); \
+ meter.measure([&] { \
+ is.clear(); \
+ is.seekg(0, std::ios::beg); \
+ return deSerializeJsonStringIfNeeded(is); \
+ }); \
+ };
+
+/* Both with and without a space character (' ') */
+#define BENCH2(_label, _chars, _length, _lengthlabel) \
+ BENCH3(_label, _chars, _length, _lengthlabel) \
+ BENCH3(_label "_with_space", " " _chars, _length, _lengthlabel) \
+
+/* Iterate over input lengths */
+#define BENCH1(_label, _chars) \
+ BENCH2(_label, _chars, 10, "small") \
+ BENCH2(_label, _chars, 10000, "large")
+
+/* Iterate over character sets */
+#define BENCH_ALL() \
+ BENCH1("alpha", "abcdefghijklmnopqrstuvwxyz") \
+ BENCH1("escaped", "\"\\/\b\f\n\r\t") \
+ BENCH1("nonascii", "\xf0\xff")
+
+TEST_CASE("benchmark_serialize") {
+ BENCH_ALL()
+}