diff options
| author | arcadia-devtools <[email protected]> | 2022-04-27 10:04:47 +0300 | 
|---|---|---|
| committer | arcadia-devtools <[email protected]> | 2022-04-27 10:04:47 +0300 | 
| commit | 0cab8da2b5ac8c6870c24756e16e6f8151ce1454 (patch) | |
| tree | 1b3dc2de8f1f475cf9b6fdcf9d52ed8e271f4e5b | |
| parent | f8cb939ce134ab4402acd871c05f85ee76fb1a2e (diff) | |
intermediate changes
ref:6498985c15da3fb6f4b628fbe715a78c29dba393
| -rw-r--r-- | library/cpp/yson/node/benchmark/reserve.cpp | 60 | ||||
| -rw-r--r-- | library/cpp/yson/node/node_builder.cpp | 10 | ||||
| -rw-r--r-- | library/cpp/yson/node/node_builder.h | 2 | 
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 00000000000..d9600e12248 --- /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 b4431bc77af..cb79ab0c976 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 69800016e09..13d2b5e4f5e 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; | 
