我的grpc服务器是在VC和传输1千兆点(1 e9)的数据-其中每个点是1,2,4或8字节的数据取决于所选的精度。我有03个客户端-每种语言一个- Cpp-14,Python-3.9和C#(.net 5.0)。C使用grpc vc包,Python使用pip包,C#使用nuget包。我的PC有10 Gig以太网卡。
在单线程中-应用程序的最大速度为Cpp:4.5 Gbps,C#:2.5 Gbps,Python:9 Gbps。为什么python的速度是C++的2倍,几乎是C#的4倍?
下面是我的代码(仅主要摘录):
原始文件:
service data {
rpc get (Request) returns (stream Response) {}
}
message Request {
string source = 1;
uint64 chunksize = 2;
}
message Response {
bytes data = 1;
}
Python代码:
def get_data():
index_dict: dict() = {1:'b', 2:'h', 4:'i', 8:'d'}
data = []
request = ABC.Request()
stub = ABC._pb2_grpc.dataStub(self._channel)
response_iterator = stub.get(request)
for response in response_iterator:
data += struct.unpack("2500h", response.data)
return data
C#代码:
using var call = _data.get(request);
var responseStream = call.ResponseStream;
while (await responseStream.MoveNext())
{
var data = responseStream.Current.Data;
ReceivedData.Append(data);
}
C++代码:
std::unique_ptr<grpc::ClientReader<Response>> reader = stubdata_->get(&context, request);
while (reader->Read(&reply))
{
src += reply.chunk().data_size();
}
2条答案
按热度按时间qnyhuwrf1#
由于gRPC Python和gRPC C使用相同的gRPC核心来执行实际工作,因此在这个简单的情况下,它们应该具有类似的性能。你是否检查过你正在用发布配置构建gRPC C?(调试构建明显较慢)
yh2wf1be2#
我知道这是一个古老的线程,但我经历过类似的问题。
我在服务器端有一个Python gRPC,在客户端有Python和.NET gRPC,Python客户端要快得多。我对gRPC通道使用了SSL加密。事实证明,SSL是问题所在。当我创建一个没有加密的通道时,两个客户端的性能是一样的。
因此,我认为这个问题高度依赖于您拥有的CPU,因为某些CPU可以比其他CPU更快地执行SSL加密和解密。There is also a description about SSL optimization being turned off in some languages in the gRPC repository.在您的情况下,优化可能会导致这种体验。
如果您没有使用加密,请忽略此操作。但是如果有人经历过这样的事情,并且使用了加密,这可能会很有用。