From 5275aed2f80e6c69d1ba5bd6b6d7cf18b8200461 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 12 Dec 2023 08:07:57 +0000 Subject: [PATCH] optimize channel args to string --- src/core/lib/channel/channel_args.cc | 38 ++++++++++++++++++---------- src/core/lib/channel/channel_args.h | 10 ++++---- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/core/lib/channel/channel_args.cc b/src/core/lib/channel/channel_args.cc index 95010e332f0..80ac7f7569c 100644 --- a/src/core/lib/channel/channel_args.cc +++ b/src/core/lib/channel/channel_args.cc @@ -280,25 +280,35 @@ absl::optional ChannelArgs::GetBool(absl::string_view name) const { } } -std::string ChannelArgs::Value::ToString() const { - if (rep_.c_vtable() == &int_vtable_) { - return std::to_string(reinterpret_cast(rep_.c_pointer())); - } +absl::string_view ChannelArgs::Value::ToString( + std::list& backing_strings) const { if (rep_.c_vtable() == &string_vtable_) { - return std::string( - static_cast(rep_.c_pointer())->as_string_view()); + return static_cast(rep_.c_pointer())->as_string_view(); + } + if (rep_.c_vtable() == &int_vtable_) { + backing_strings.emplace_back( + std::to_string(reinterpret_cast(rep_.c_pointer()))); + return backing_strings.back(); } - return absl::StrFormat("%p", rep_.c_pointer()); + backing_strings.emplace_back(absl::StrFormat("%p", rep_.c_pointer())); + return backing_strings.back(); } std::string ChannelArgs::ToString() const { - std::vector arg_strings; - args_.ForEach( - [&arg_strings](const RefCountedStringValue& key, const Value& value) { - arg_strings.push_back( - absl::StrCat(key.as_string_view(), "=", value.ToString())); - }); - return absl::StrCat("{", absl::StrJoin(arg_strings, ", "), "}"); + std::vector strings; + std::list backing_strings; + strings.push_back("{"); + bool first = true; + args_.ForEach([&strings, &first, &backing_strings]( + const RefCountedStringValue& key, const Value& value) { + if (!first) strings.push_back(", "); + first = false; + strings.push_back(key.as_string_view()); + strings.push_back("="); + strings.push_back(value.ToString(backing_strings)); + }); + strings.push_back("}"); + return absl::StrJoin(strings, ""); } ChannelArgs ChannelArgs::UnionWith(ChannelArgs other) const { diff --git a/src/core/lib/channel/channel_args.h b/src/core/lib/channel/channel_args.h index 2c10d955127..ca8df06a286 100644 --- a/src/core/lib/channel/channel_args.h +++ b/src/core/lib/channel/channel_args.h @@ -345,7 +345,7 @@ class ChannelArgs { return &rep_; } - std::string ToString() const; + absl::string_view ToString(std::list& backing) const; grpc_arg MakeCArg(const char* name) const; @@ -391,8 +391,8 @@ class ChannelArgs { // Only used in union_with_test.cc, reference version of UnionWith for // differential fuzzing. - GRPC_MUST_USE_RESULT ChannelArgs - FuzzingReferenceUnionWith(ChannelArgs other) const; + GRPC_MUST_USE_RESULT ChannelArgs FuzzingReferenceUnionWith( + ChannelArgs other) const; const Value* Get(absl::string_view name) const; GRPC_MUST_USE_RESULT ChannelArgs Set(absl::string_view name, @@ -466,8 +466,8 @@ class ChannelArgs { GRPC_MUST_USE_RESULT ChannelArgs Remove(absl::string_view name) const; bool Contains(absl::string_view name) const; - GRPC_MUST_USE_RESULT ChannelArgs - RemoveAllKeysWithPrefix(absl::string_view prefix) const; + GRPC_MUST_USE_RESULT ChannelArgs RemoveAllKeysWithPrefix( + absl::string_view prefix) const; template bool ContainsObject() const {