首页  >  文章  >  Java  >  如何在 C 中实现协议缓冲区定界 I/O:缺少的功能和潜在的优化

如何在 C 中实现协议缓冲区定界 I/O:缺少的功能和潜在的优化

Patricia Arquette
Patricia Arquette原创
2024-11-03 06:44:30436浏览

 How to Implement Protocol Buffers Delimited I/O in C  : Missing Functionality and Potential Optimizations

Java 中 Protocol Buffers 分隔 I/O 函数的 C 等效项

在 Protocol Buffers 中,在消息之前添加长度前缀对于读取和发送消息至关重要从文件写入多条消息。虽然 Java 为此目的提供了“定界”I/O 函数(例如 parseDelimitedFrom、mergeDelimitedFrom、writeDelimitedTo),但 C 缺乏等效函数。

Google 推荐

Google 推荐在 C 中手动为消息附加长度前缀。这涉及到:

  • 将消息大小写入 Varint
  • 将消息序列化到缓冲区

但是,这种方法缺乏优化,可能会失败输入大于 64MB。

优化的 C 实现

随后,前 Google protobuf 库作者开发并共享了优化的 C 实现。这些实现包括:

  • 将大小写入 Varint
  • 使用 GetDirectBufferForNBytesAndAdvance 方法进行高效序列化
  • 强制每条消息的大小限制为 64MB

实现细节

writeDelimitedTo 函数为每条消息创建一个新的 CodedOutputStream 并使用 SerializeWithCachedSizes 方法将其序列化。如果消息适合一个缓冲区,则使用更快的 SerializeWithCachedSizesToArray 方法。

readDelimitedFrom 函数创建一个新的 CodedInputStream 并使用 PushLimit 方法对每条消息施加大小限制。然后,它使用 MergeFromCodedStream 方法解析消息并验证整个消息是否已被消耗。

可用性

这些优化的 C 实现不是官方 protobuf 库的一部分。但是,它们可以在各种第三方存储库中找到,或者使用提供的代码片段手动实现。

以上是如何在 C 中实现协议缓冲区定界 I/O:缺少的功能和潜在的优化的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn