为什么Python中的Grpc客户端比C#和C++客户端更快

y4ekin9u  于 2023-05-08  发布在  Python
关注(0)|答案(2)|浏览(241)

我的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();
}
qnyhuwrf

qnyhuwrf1#

由于gRPC Python和gRPC C使用相同的gRPC核心来执行实际工作,因此在这个简单的情况下,它们应该具有类似的性能。你是否检查过你正在用发布配置构建gRPC C?(调试构建明显较慢)

yh2wf1be

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.在您的情况下,优化可能会导致这种体验。
如果您没有使用加密,请忽略此操作。但是如果有人经历过这样的事情,并且使用了加密,这可能会很有用。

相关问题