aboutsummaryrefslogtreecommitdiffstats
path: root/tools/enum_parser/parse_enum/benchmark/main.cpp
diff options
context:
space:
mode:
authorarcadia-devtools <arcadia-devtools@yandex-team.ru>2022-05-31 21:49:01 +0300
committerarcadia-devtools <arcadia-devtools@yandex-team.ru>2022-05-31 21:49:01 +0300
commitceb13dcc40dd5e11c8e3189b3c15b3bd5897d4ac (patch)
treeeda501e07fcaba4f64bc3d29725472162f2e4227 /tools/enum_parser/parse_enum/benchmark/main.cpp
parent5b69557e440e6ac18399a29076fef25602859f17 (diff)
downloadydb-ceb13dcc40dd5e11c8e3189b3c15b3bd5897d4ac.tar.gz
intermediate changes
ref:85306a27df0004d13faf777131d0b092370e6b90
Diffstat (limited to 'tools/enum_parser/parse_enum/benchmark/main.cpp')
-rw-r--r--tools/enum_parser/parse_enum/benchmark/main.cpp97
1 files changed, 97 insertions, 0 deletions
diff --git a/tools/enum_parser/parse_enum/benchmark/main.cpp b/tools/enum_parser/parse_enum/benchmark/main.cpp
new file mode 100644
index 0000000000..9f2694f236
--- /dev/null
+++ b/tools/enum_parser/parse_enum/benchmark/main.cpp
@@ -0,0 +1,97 @@
+#include <tools/enum_parser/parse_enum/benchmark/enum.h_serialized.h>
+#include <library/cpp/testing/benchmark/bench.h>
+#include <util/generic/algorithm.h>
+#include <util/generic/vector.h>
+#include <util/generic/xrange.h>
+#include <util/stream/null.h>
+#include <util/string/cast.h>
+
+namespace {
+
+ template <class TEnum>
+ TVector<TEnum> SelectValues(size_t count) {
+ auto values = GetEnumAllValues<TEnum>().Materialize();
+ SortBy(values, [](const TEnum& v) { return IntHash(static_cast<ui64>(v)); });
+ values.crop(count);
+ return values;
+ }
+
+ template <class TEnum>
+ TVector<TStringBuf> SelectStrings(size_t count) {
+ TVector<TStringBuf> strings(Reserve(GetEnumItemsCount<TEnum>()));
+ for (const auto& [_, s] : GetEnumNames<TEnum>()) {
+ strings.push_back(s);
+ }
+ SortBy(strings, [](const TStringBuf& s) { return THash<TStringBuf>()(s); });
+ strings.crop(count);
+ return strings;
+ }
+
+ template <class TEnum, class TContext>
+ void BMToString(TContext& iface) {
+ const auto values = SelectValues<TEnum>(5u);
+ for (const auto iter : xrange(iface.Iterations())) {
+ Y_UNUSED(iter);
+ for (const auto value : values) {
+ Y_DO_NOT_OPTIMIZE_AWAY(ToString(value).size());
+ }
+ }
+ }
+
+ template <class TEnum, class TContext>
+ void BMOut(TContext& iface) {
+ const auto values = SelectValues<TEnum>(5u);
+ TNullOutput null;
+ for (const auto iter : xrange(iface.Iterations())) {
+ Y_UNUSED(iter);
+ for (const auto value : values) {
+ Y_DO_NOT_OPTIMIZE_AWAY(null << value);
+ }
+ }
+ }
+
+ template <class TEnum, class TContext>
+ void BMFromString(TContext& iface) {
+ const auto strings = SelectStrings<TEnum>(5u);
+ for (const auto iter : xrange(iface.Iterations())) {
+ Y_UNUSED(iter);
+ for (const auto s : strings) {
+ Y_DO_NOT_OPTIMIZE_AWAY(FromString<TEnum>(s));
+ }
+ }
+ }
+
+ template <class TEnum, class TContext>
+ void BMTryFromString(TContext& iface) {
+ auto strings = SelectStrings<TEnum>(5u);
+ strings.back() = "fake";
+
+ TEnum value;
+ for (const auto iter : xrange(iface.Iterations())) {
+ Y_UNUSED(iter);
+ for (const auto s : strings) {
+ Y_DO_NOT_OPTIMIZE_AWAY(TryFromString<TEnum>(s, value));
+ }
+ }
+ }
+}
+
+#define DEFINE_BENCHMARK(name) \
+ Y_CPU_BENCHMARK(ToString_##name, iface) { \
+ BMToString<name>(iface); \
+ } \
+ Y_CPU_BENCHMARK(Out_##name, iface) { \
+ BMOut<name>(iface); \
+ } \
+ Y_CPU_BENCHMARK(FromString_##name, iface) { \
+ BMFromString<name>(iface); \
+ } \
+ Y_CPU_BENCHMARK(TryFromString_##name, iface) { \
+ BMTryFromString<name>(iface); \
+ }
+
+DEFINE_BENCHMARK(ESmallSortedEnum);
+DEFINE_BENCHMARK(ESmalUnsortedEnum);
+DEFINE_BENCHMARK(EBigSortedEnum);
+DEFINE_BENCHMARK(EBigUnsortedEnum);
+DEFINE_BENCHMARK(EBigUnsortedDenseEnum);