IOBuf公司

了解bRPC IOBuf。

brpc使用butil::IOBuf作为一些协议和HTTP正文中附件的数据结构。它是一个非连续的零复制缓冲区,在以前的项目中得到了证明,并且性能良好。的界面IOBuf公司类似于标准::字符串,但不一样。

如果您使用了Buf手柄在麒麟之前,你应该注意到IOBuf公司:前者封装得很糟糕,将内部结构直接放在用户面前,用户必须小心处理引用计数,很容易出错并导致错误。

IOBuf可以:

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

IOBuf不能:

  • 在程序中用作通用的类似字符串的结构。IOBuf的生存期应较短,以防止IOBuf中引用计数的块(每个8K)锁定过多内存。

剪切

从source_buf前端剪切16个字节并附加到dest_buf:

源_buf.(&目标(_buf), 16); //当source_buf的长度<16时,剪切它的所有字节

只需从source_buf的前端弹出16个字节:

源(_buf).pop_前(16); //长度<16时为空source_buf

追加

将另一个IOBuf附加到后端:

缓冲器.追加(另一个buf);  //无数据副本

将std::string附加到背面

缓冲器.追加(字符串);  //将str的数据复制到buf中

分析

解析IOBuf中的protobuf消息

IOBufAsZeroCopy输入流 包装器(&伊奥布夫);
pb_消息.解析自零拷贝流(&包装器);

以用户定义的格式分析IOBuf

IOBufAsZeroCopy输入流 包装器(&伊奥布夫);
编码输入流 编码流(&包装器);
编码流.ReadLittleEndian32(&价值);
...

序列化

将protobuf消息序列化到IOBuf

IOBufAsZeroCopy输出流 包装器(&伊奥布夫);
pb_消息.序列化为零拷贝流(&包装器);

使用可打印数据构建IOBuf

IOBufBuilder公司 操作系统
操作系统 << “任何东西都可以发送到std::ostream”
操作系统.缓冲器();  //IOBuf公司

打印

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

标准::cout公司 << 伊奥布夫 << 标准::端部
//或标准::一串 字符串 = 伊奥布夫.到字符串(_S)(); //注意:分配内存打印(“%s”\n个", 字符串.c_str码());

性能

IOBuf擅长性能:

行动吞吐量质量保证体系
从文件读取->剪切12+16字节->复制->合并到另一个缓冲区->写入/dev/null240.423MB/s8586535
从文件读取->剪切12+128字节->复制->合并到另一个缓冲区->写入/dev/null790.022MB/s5643014
从文件读取->剪切12+1024字节->复制->合并到另一个缓冲区->写入/dev/null1519.99 MB/s1467171

上次修改时间:2024年5月6日更新index.md(66353dc)