brpc uses butil::IOBuf as data structure for attachment in some protocols and HTTP body. It's a non-contiguous zero-copied buffer, proved in previous projects, and good at performance. The interface of IOBuf
is similar to std::string
, but not the same.
If you've used the BufHandle
in Kylin before, you should notice the convenience of IOBuf
: the former one is badly encapsulated, leaving the internal structure directly in front of users, who must carefully handle the referential countings, very error prone and leading to bugs.
Cut 16 bytes from front-side of source_buf and append to dest_buf:
source_buf.cut(&dest_buf, 16); // cut all bytes of source_buf when its length < 16
Just pop 16 bytes from front-side of source_buf:
source_buf.pop_front(16); // Empty source_buf when its length < 16
Append another IOBuf to back-side:
buf.append(another_buf); // no data copy
Append std::string to back-sie
buf.append(str); // copy data of str into buf
Parse a protobuf message from the IOBuf
IOBufAsZeroCopyInputStream wrapper(&iobuf);
pb_message.ParseFromZeroCopyStream(&wrapper);
Parse IOBuf in user-defined formats
IOBufAsZeroCopyInputStream wrapper(&iobuf);
CodedInputStream coded_stream(&wrapper);
coded_stream.ReadLittleEndian32(&value);
...
Serialize a protobuf message into the IOBuf
IOBufAsZeroCopyOutputStream wrapper(&iobuf);
pb_message.SerializeToZeroCopyStream(&wrapper);
Built IOBuf with printable data
IOBufBuilder os;
os << "anything can be sent to std::ostream";
os.buf(); // IOBuf
Directly printable to std::ostream. Note that the iobuf in following example should only contain printable characters.
std::cout << iobuf << std::endl;
// or
std::string str = iobuf.to_string(); // note: allocating memory
printf("%s\n", str.c_str());
IOBuf is good at performance:
Action | Throughput | QPS |
---|---|---|
Read from file -> Cut 12+16 bytes -> Copy -> Merge into another buffer ->Write to /dev/null | 240.423MB/s | 8586535 |
Read from file -> Cut 12+128 bytes -> Copy-> Merge into another buffer ->Write to /dev/null | 790.022MB/s | 5643014 |
Read from file -> Cut 12+1024 bytes -> Copy-> Merge into another buffer ->Write to /dev/null | 1519.99MB/s | 1467171 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。