diff options
author | zhizhin <zhizhin@yandex-team.com> | 2022-08-23 13:35:29 +0300 |
---|---|---|
committer | zhizhin <zhizhin@yandex-team.com> | 2022-08-23 13:35:29 +0300 |
commit | e200c8e2aa45d15f672a8ea2029e39a9f1620e6a (patch) | |
tree | 31ce657d8ebe03a8a64895769ec26e27d1be6c11 /library/cpp/yson | |
parent | 95330412936b4d7ccae8ad4e9870ecf21f0ec220 (diff) | |
download | ydb-e200c8e2aa45d15f672a8ea2029e39a9f1620e6a.tar.gz |
Avoid unnecessary copies when visiting yson graph
При вызове лямбды происходит деаллокация большого числа TNode. Они деаллоцируются внутри
лямбд так как лямбды принимают `const std::pair<TString, TNode>&`, а
`THashMap` итерирует по `const std::pair<const TString, TNode>&`
Меняю явный тип на `const auto&`.
Предыстория:
После перехода на TC Malloc начали в сервере ловить странные кордампы
при десериализации YSON в строку.
Пример дампа: https://coredumps.n.yandex-team.ru/core_trace?core_id=47595674
Вот как вызывали: https://a.yandex-team.ru/arcadia/voicetech/library/asr_logs/message_logger.cpp?rev=rXXXXXX#L161
Вычитка кода показала, что переменная EngineInfo всегда валидная (ссылка
на константную глобальную переменную, которая жива всегда во время
работы программы).
В кордампе заметили деаллокации внутри этих лямбд и поняли, что происходят ненужные копирования.
Предполагаем, что деаллокации внутри YSON могут быть причиной кордампов.
Diffstat (limited to 'library/cpp/yson')
-rw-r--r-- | library/cpp/yson/node/node_visitor.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/library/cpp/yson/node/node_visitor.cpp b/library/cpp/yson/node/node_visitor.cpp index 899fbfa02a..41181a7507 100644 --- a/library/cpp/yson/node/node_visitor.cpp +++ b/library/cpp/yson/node/node_visitor.cpp @@ -44,7 +44,7 @@ void TNodeVisitor::VisitAny(const TNode& node) { if (node.HasAttributes()) { Consumer_->OnBeginAttributes(); - Iterate(node.GetAttributes().AsMap(), SortMapKeys_, [&](const std::pair<TString, TNode>& item) { + Iterate(node.GetAttributes().AsMap(), SortMapKeys_, [&](const auto& item) { Consumer_->OnKeyedItem(item.first); if (item.second.IsUndefined()) { ythrow TNode::TTypeError() << "unable to visit attribute value of type " @@ -131,7 +131,7 @@ void TNodeVisitor::VisitList(const TNode::TListType& nodeList) void TNodeVisitor::VisitMap(const TNode::TMapType& nodeMap) { Consumer_->OnBeginMap(); - Iterate(nodeMap, SortMapKeys_, [&](const std::pair<TString, TNode>& item) { + Iterate(nodeMap, SortMapKeys_, [&](const auto& item) { Consumer_->OnKeyedItem(item.first); if (item.second.IsUndefined()) { ythrow TNode::TTypeError() << "unable to visit map node child of type " |