Avoid allocating temporary strings in Channel::CreateCall().

Add `SliceFromArray()` which takes a `char*` instead of
`const string&`, to save string allocations for copying from a `char *`.

Use the new API to eliminate two string allocations and copies per call for
method and host names.

release-note: no
pull/16699/head
Soheil Hassas Yeganeh 7 years ago
parent ccbad108e4
commit c1a1d66864
  1. 4
      include/grpcpp/impl/codegen/slice.h
  2. 6
      src/cpp/client/channel_cc.cc

@ -138,6 +138,10 @@ inline grpc_slice SliceFromCopiedString(const grpc::string& str) {
str.length());
}
inline grpc_slice SliceFromArray(const char* arr, size_t len) {
return g_core_codegen_interface->grpc_slice_from_copied_buffer(arr, len);
}
} // namespace grpc
#endif // GRPCPP_IMPL_CODEGEN_SLICE_H

@ -20,6 +20,7 @@
#include <chrono>
#include <condition_variable>
#include <cstring>
#include <memory>
#include <mutex>
@ -116,10 +117,11 @@ internal::Call Channel::CreateCall(const internal::RpcMethod& method,
} else if (!host_.empty()) {
host_str = host_.c_str();
}
grpc_slice method_slice = SliceFromCopiedString(method.name());
grpc_slice method_slice =
SliceFromArray(method.name(), strlen(method.name()));
grpc_slice host_slice;
if (host_str != nullptr) {
host_slice = SliceFromCopiedString(host_str);
host_slice = SliceFromArray(host_str, strlen(host_str));
}
c_call = grpc_channel_create_call(
c_channel_, context->propagate_from_call_,

Loading…
Cancel
Save