[channel-args] Optimize channel args to string (#35286)

One of the more major CPU sinks for b/311358095

Closes #35286

COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/35286 from ctiller:fuzz-311358095 ad4278937f
PiperOrigin-RevId: 590247206
pull/35294/head
Craig Tiller 1 year ago committed by Copybara-Service
parent eaf1a92264
commit 75686ed19d
  1. 38
      src/core/lib/channel/channel_args.cc
  2. 2
      src/core/lib/channel/channel_args.h

@ -280,25 +280,35 @@ absl::optional<bool> 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<intptr_t>(rep_.c_pointer()));
}
absl::string_view ChannelArgs::Value::ToString(
std::list<std::string>& backing_strings) const {
if (rep_.c_vtable() == &string_vtable_) {
return std::string(
static_cast<RefCountedString*>(rep_.c_pointer())->as_string_view());
return static_cast<RefCountedString*>(rep_.c_pointer())->as_string_view();
}
if (rep_.c_vtable() == &int_vtable_) {
backing_strings.emplace_back(
std::to_string(reinterpret_cast<intptr_t>(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<std::string> 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<absl::string_view> strings;
std::list<std::string> 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 {

@ -345,7 +345,7 @@ class ChannelArgs {
return &rep_;
}
std::string ToString() const;
absl::string_view ToString(std::list<std::string>& backing) const;
grpc_arg MakeCArg(const char* name) const;

Loading…
Cancel
Save