首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么protobuf为字节列表比memcpy慢5-10倍?

为什么protobuf为字节列表比memcpy慢5-10倍?
EN

Stack Overflow用户
提问于 2021-12-20 22:35:49
回答 1查看 403关注 0票数 2

我有两个性能截然不同的简单代码块:

代码语言:javascript
复制
void testProto() {
  demo::Person* person = new demo::Person();
  person->set_data(data, BUFFER_LEN);
}

void testMemcpy() {
  demo::Person* person = new demo::Person();
  memcpy(memcpy_dest, data, BUFFER_LEN);
}

proto文件如下所示:

代码语言:javascript
复制
message Person {
  bytes data = 1;
}

根据Protobuf编码文档,设置长度分隔的数据就像用几个头字节复制数据一样简单。为什么第一个函数比第二个函数花费的时间多5-10倍?

我制作了一个完整的、易于运行的示例这里

补充说明/背景:

  • Flatbuffers和protobufs的替代程序没有这个问题。
  • 这是我的尝试在使用调试器时。我不能在Set方法下面一步。
  • 这个性能对我很重要的原因是,我正在将一些高吞吐量/低延迟的网络代码转换为protobufs。由于我运行的代码类似于上面每包多次运行的代码,所以protobufs严重损害了性能。
  • 我在-O3跑步,但即使在-O0,性能上还是有很大的差异
  • 函数调用开销不是问题,因为糟糕的性能随着数据的大小而变小。函数调用只是一个恒定的开销。
  • 我尝试过多种方法来确保memcpy不被优化(-O0,使用数组)。我很有信心memcpy没有被优化掉。
  • 我在testMemcpy里面试过malloc。这让事情慢了一点,但至少还要差5倍。
  • 我在Macbook M1和Ubuntu Intel机器上试过这个
EN

回答 1

Stack Overflow用户

发布于 2021-12-20 23:30:24

基准测试中的代码无效。这个节目的格式不正确.

如果不是的话,[如-规则]就会适用。

调用testMemcpy()函数与不做任何操作之间没有明显的行为差异。(除了分配不能释放的内存之外,还可以忽略内存,这是未定义的行为)。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70428781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档