IOBuf

qianmoQqianmoQ· 更新于 2026-10-05· 阅读 5 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

IOBuf

了解 bRPC 的 IOBuf。

brpc 在某些协议的附件和 HTTP 正文中使用 butil::IOBuf 作为数据结构。它是一种非连续、零拷贝的缓冲区,已在既往项目中得到验证,性能表现良好。IOBuf 的接口与 std::string 相似,但并不完全相同。

如果你之前在 Kylin 中使用过 BufHandle,就应该能体会到 IOBuf 的便利之处:前者的封装非常糟糕,直接将内部结构暴露给使用者,用户必须小心处理引用计数,非常容易出错并导致 bug。

IOBuf 能做到的:

  • 默认构造函数不分配内存。
  • 可复制。对副本的修改不会影响原始对象。只复制 IOBuf 的管理结构,而不复制数据负载。
  • 可以追加另一个 IOBuf,无需复制数据负载。
  • 可以追加字符串,需要复制数据负载。
  • 可以从文件描述符读取或写入。
  • 可以序列化为或从 protobuf 消息解析。
  • 可以像 std::ostream 一样通过 IOBufBuilder 进行构造。

IOBuf 做不到的:

  • 作为程序中通用的类字符串结构使用。IOBuf 的生命周期应当是短暂的,以防止 IOBuf 中被引用计数的块(每个 8K)锁定过多的内存。

Cut(截取)

从 source_buf 的头部截取 16 字节并追加到 dest_buf:

source_buf.cut(&dest_buf, 16); // cut all bytes of source_buf when its length < 16

仅从 source_buf 的前端弹出 16 字节:

source_buf.pop_front(16); // Empty source_buf when its length < 16

Append(追加)

将另一个 IOBuf 追加到尾部:

buf.append(another_buf);  // no data copy

向尾端追加 std::string

buf.append(str);  // copy data of str into buf

解析(Parse)

从 IOBuf 中解析 protobuf 消息

IOBufAsZeroCopyInputStream wrapper(&iobuf);
pb_message.ParseFromZeroCopyStream(&wrapper);

按用户自定义格式解析 IOBuf

IOBufAsZeroCopyInputStream wrapper(&iobuf);
CodedInputStream coded_stream(&wrapper);
coded_stream.ReadLittleEndian32(&value);
...

Serialize

将 protobuf 消息序列化为 IOBuf

IOBufAsZeroCopyOutputStream wrapper(&iobuf);
pb_message.SerializeToZeroCopyStream(&wrapper);

用可打印数据构建 IOBuf

IOBufBuilder os;
os << "anything can be sent to std::ostream";
os.buf();  // IOBuf

打印

可直接输出到 std::ostream。注意,下例中的 iobuf 应只包含可打印字符。

std::cout << iobuf << std::endl;
// or
std::string str = iobuf.to_string(); // note: allocating memory
printf("%s\n", str.c_str());

性能

IOBuf 在性能方面表现出色:

操作吞吐量QPS
从文件读取 -> 切分 12+16 字节 -> 拷贝 -> 合并到另一个缓冲区 -> 写入 /dev/null240.423MB/s8586535
从文件读取 -> 切分 12+128 字节 -> 拷贝 -> 合并到另一个缓冲区 -> 写入 /dev/null790.022MB/s5643014
从文件读取 -> 切分 12+1024 字节 -> 拷贝 -> 合并到另一个缓冲区 -> 写入 /dev/null1519.99MB/s1467171

最后修改于 2022 年 1 月 9 日:[基于 hugo 的新版 brpc 网站 (94b25d711)]](https://github.com/apache/brpc-website/commit/94b25d7110944f3d4b2071b5188c691b23ffe3a9)

评论

登录后参与评论

正在加载评论…