IOBuf
登录后可跨设备保存划线和私人笔记登录
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 < 16Append(追加)
将另一个 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/null | 240.423MB/s | 8586535 |
| 从文件读取 -> 切分 12+128 字节 -> 拷贝 -> 合并到另一个缓冲区 -> 写入 /dev/null | 790.022MB/s | 5643014 |
| 从文件读取 -> 切分 12+1024 字节 -> 拷贝 -> 合并到另一个缓冲区 -> 写入 /dev/null | 1519.99MB/s | 1467171 |
最后修改于 2022 年 1 月 9 日:[基于 hugo 的新版 brpc 网站 (94b25d711)]](https://github.com/apache/brpc-website/commit/94b25d7110944f3d4b2071b5188c691b23ffe3a9)
评论
登录后参与评论
正在加载评论…
KnowForge