代码拉取完成,页面将自动刷新
同步操作将从 百度开源/BRPC 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
brpc使用butil::IOBuf作为一些协议中的附件或http body的数据结构,它是一种非连续零拷贝缓冲,在其他项目中得到了验证并有出色的性能。IOBuf的接口和std::string类似,但不相同。
如果你之前使用Kylin中的BufHandle,你将更能感受到IOBuf的便利性:前者几乎没有实现完整,直接暴露了内部结构,用户得小心翼翼地处理引用计数,极易出错。
从source_buf头部切下16字节放入dest_buf:
source_buf.cut(&dest_buf, 16); // 当source_buf不足16字节时,切掉所有字节。
从source_buf头部弹掉16字节:
source_buf.pop_front(16); // 当source_buf不足16字节时,清空它
在尾部加入另一个IOBuf:
buf.append(another_buf); // no data copy
在尾部加入std::string
buf.append(str); // copy data of str into buf
解析IOBuf为protobuf message
IOBufAsZeroCopyInputStream wrapper(&iobuf);
pb_message.ParseFromZeroCopyStream(&wrapper);
解析IOBuf为自定义结构
IOBufAsZeroCopyInputStream wrapper(&iobuf);
CodedInputStream coded_stream(&wrapper);
coded_stream.ReadLittleEndian32(&value);
...
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(); // 注意: 会分配内存
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 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。