aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/yson
diff options
context:
space:
mode:
authorarcadia-devtools <arcadia-devtools@yandex-team.ru>2022-04-27 10:04:47 +0300
committerarcadia-devtools <arcadia-devtools@yandex-team.ru>2022-04-27 10:04:47 +0300
commit0cab8da2b5ac8c6870c24756e16e6f8151ce1454 (patch)
tree1b3dc2de8f1f475cf9b6fdcf9d52ed8e271f4e5b /library/cpp/yson
parentf8cb939ce134ab4402acd871c05f85ee76fb1a2e (diff)
downloadydb-0cab8da2b5ac8c6870c24756e16e6f8151ce1454.tar.gz
intermediate changes
ref:6498985c15da3fb6f4b628fbe715a78c29dba393
Diffstat (limited to 'library/cpp/yson')
-rw-r--r--library/cpp/yson/node/benchmark/reserve.cpp60
-rw-r--r--library/cpp/yson/node/node_builder.cpp10
-rw-r--r--library/cpp/yson/node/node_builder.h2
3 files changed, 72 insertions, 0 deletions
diff --git a/library/cpp/yson/node/benchmark/reserve.cpp b/library/cpp/yson/node/benchmark/reserve.cpp
new file mode 100644
index 0000000000..d9600e1224
--- /dev/null
+++ b/library/cpp/yson/node/benchmark/reserve.cpp
@@ -0,0 +1,60 @@
+#include <benchmark/benchmark.h>
+
+#include <library/cpp/yson/node/node_builder.h>
+
+using namespace NYT;
+
+static void BM_Map(benchmark::State& state, const std::tuple<int, bool>& input) {
+ for (auto _ : state) {
+ TNode node;
+ TNodeBuilder builder(&node);
+ if (std::get<1>(input)) {
+ builder.OnBeginMap(std::get<0>(input));
+ } else {
+ builder.OnBeginMap();
+ }
+ for (auto i = 0; i < std::get<0>(input); ++i) {
+ builder.OnKeyedItem(ToString(i));
+ builder.OnUint64Scalar(i);
+ }
+ builder.OnEndMap();
+ }
+}
+
+static void BM_List(benchmark::State& state, const std::tuple<int, bool>& input) {
+ for (auto _ : state) {
+ TNode node;
+ TNodeBuilder builder(&node);
+ if (std::get<1>(input)) {
+ builder.OnBeginList(std::get<0>(input));
+ } else {
+ builder.OnBeginList();
+ }
+ for (auto i = 0; i < std::get<0>(input); ++i) {
+ builder.OnListItem();
+ builder.OnUint64Scalar(i);
+ }
+ builder.OnEndList();
+ }
+}
+
+BENCHMARK_CAPTURE(BM_Map, map_10, std::make_tuple(10u, false));
+BENCHMARK_CAPTURE(BM_Map, map_100, std::make_tuple(100u, false));
+BENCHMARK_CAPTURE(BM_Map, map_300, std::make_tuple(300u, false));
+BENCHMARK_CAPTURE(BM_Map, map_500, std::make_tuple(500u, false));
+BENCHMARK_CAPTURE(BM_Map, map_1000, std::make_tuple(1000u, false));
+BENCHMARK_CAPTURE(BM_Map, map_reserve_10, std::make_tuple(10u, true));
+BENCHMARK_CAPTURE(BM_Map, map_reserve_100, std::make_tuple(100u, true));
+BENCHMARK_CAPTURE(BM_Map, map_reserve_300, std::make_tuple(300u, true));
+BENCHMARK_CAPTURE(BM_Map, map_reserve_500, std::make_tuple(500u, true));
+BENCHMARK_CAPTURE(BM_Map, map_reserve_1000, std::make_tuple(1000u, true));
+BENCHMARK_CAPTURE(BM_List, list_10, std::make_tuple(10u, false));
+BENCHMARK_CAPTURE(BM_List, list_100, std::make_tuple(100u, false));
+BENCHMARK_CAPTURE(BM_List, list_300, std::make_tuple(300u, false));
+BENCHMARK_CAPTURE(BM_List, list_500, std::make_tuple(500u, false));
+BENCHMARK_CAPTURE(BM_List, list_1000, std::make_tuple(1000u, false));
+BENCHMARK_CAPTURE(BM_List, list_reserve_10, std::make_tuple(10u, true));
+BENCHMARK_CAPTURE(BM_List, list_reserve_100, std::make_tuple(100u, true));
+BENCHMARK_CAPTURE(BM_List, list_reserve_300, std::make_tuple(300u, true));
+BENCHMARK_CAPTURE(BM_List, list_reserve_500, std::make_tuple(500u, true));
+BENCHMARK_CAPTURE(BM_List, list_reserve_1000, std::make_tuple(1000u, true));
diff --git a/library/cpp/yson/node/node_builder.cpp b/library/cpp/yson/node/node_builder.cpp
index b4431bc77a..cb79ab0c97 100644
--- a/library/cpp/yson/node/node_builder.cpp
+++ b/library/cpp/yson/node/node_builder.cpp
@@ -44,6 +44,11 @@ void TNodeBuilder::OnBeginList()
AddNode(TNode::CreateList(), false);
}
+void TNodeBuilder::OnBeginList(ui64 reserveSize) {
+ OnBeginList();
+ Stack_.top()->AsList().reserve(reserveSize);
+}
+
void TNodeBuilder::OnListItem()
{
Stack_.push(&Stack_.top()->Add());
@@ -59,6 +64,11 @@ void TNodeBuilder::OnBeginMap()
AddNode(TNode::CreateMap(), false);
}
+void TNodeBuilder::OnBeginMap(ui64 reserveSize) {
+ OnBeginMap();
+ Stack_.top()->AsMap().reserve(reserveSize);
+}
+
void TNodeBuilder::OnKeyedItem(TStringBuf key)
{
Stack_.push(&(*Stack_.top())[TString(key)]);
diff --git a/library/cpp/yson/node/node_builder.h b/library/cpp/yson/node/node_builder.h
index 69800016e0..13d2b5e4f5 100644
--- a/library/cpp/yson/node/node_builder.h
+++ b/library/cpp/yson/node/node_builder.h
@@ -25,9 +25,11 @@ public:
void OnBooleanScalar(bool) override;
void OnEntity() override;
void OnBeginList() override;
+ void OnBeginList(ui64 reserveSize);
void OnListItem() override;
void OnEndList() override;
void OnBeginMap() override;
+ void OnBeginMap(ui64 reserveSize);
void OnKeyedItem(TStringBuf) override;
void OnEndMap() override;
void OnBeginAttributes() override;