Browse Source

intermediate changes
ref:6498985c15da3fb6f4b628fbe715a78c29dba393

arcadia-devtools 2 years ago
parent
commit
0cab8da2b5

+ 60 - 0
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));

+ 10 - 0
library/cpp/yson/node/node_builder.cpp

@@ -44,6 +44,11 @@ void TNodeBuilder::OnBeginList()
     AddNode(TNode::CreateList(), false);
     AddNode(TNode::CreateList(), false);
 }
 }
 
 
+void TNodeBuilder::OnBeginList(ui64 reserveSize) {
+    OnBeginList();
+    Stack_.top()->AsList().reserve(reserveSize);
+}
+
 void TNodeBuilder::OnListItem()
 void TNodeBuilder::OnListItem()
 {
 {
     Stack_.push(&Stack_.top()->Add());
     Stack_.push(&Stack_.top()->Add());
@@ -59,6 +64,11 @@ void TNodeBuilder::OnBeginMap()
     AddNode(TNode::CreateMap(), false);
     AddNode(TNode::CreateMap(), false);
 }
 }
 
 
+void TNodeBuilder::OnBeginMap(ui64 reserveSize) {
+    OnBeginMap();
+    Stack_.top()->AsMap().reserve(reserveSize);
+}
+
 void TNodeBuilder::OnKeyedItem(TStringBuf key)
 void TNodeBuilder::OnKeyedItem(TStringBuf key)
 {
 {
     Stack_.push(&(*Stack_.top())[TString(key)]);
     Stack_.push(&(*Stack_.top())[TString(key)]);

+ 2 - 0
library/cpp/yson/node/node_builder.h

@@ -25,9 +25,11 @@ public:
     void OnBooleanScalar(bool) override;
     void OnBooleanScalar(bool) override;
     void OnEntity() override;
     void OnEntity() override;
     void OnBeginList() override;
     void OnBeginList() override;
+    void OnBeginList(ui64 reserveSize);
     void OnListItem() override;
     void OnListItem() override;
     void OnEndList() override;
     void OnEndList() override;
     void OnBeginMap() override;
     void OnBeginMap() override;
+    void OnBeginMap(ui64 reserveSize);
     void OnKeyedItem(TStringBuf) override;
     void OnKeyedItem(TStringBuf) override;
     void OnEndMap() override;
     void OnEndMap() override;
     void OnBeginAttributes() override;
     void OnBeginAttributes() override;