Protobuf高性能接口ZeroCopyStream

news2024/11/26 4:42:27

Protobuf ZeroCopyStream

1.ZeroCopyStream

protobuf在io接口上有一个叫做ZeroCopyStream,对于IO的接口设计,pb提供了相关序列化与反序列化接口,如:

// Read a protocol buffer from the given zero-copy input stream.  If
// successful, the entire input will be consumed.
bool ParseFromZeroCopyStream(io::ZeroCopyInputStream* input);

// Write the message to the given zero-copy output stream.  All required
// fields must be set.
bool SerializeToZeroCopyStream(io::ZeroCopyOutputStream* output) const;

ZeroCopyStream设计的初衷是最小化buffer的拷贝次数,即省略掉stream内部数据拷贝到用户buffer。因此,stream可以返回一个缓冲区,该缓冲区实际上直接指向要存储字节的最终数据结构,并且调用者可以直接与该缓冲区交互,从而消除了中间复制操作。

例如:经典的IO stream:

char buffer[[]BUFFER_SIZE];
input->Read(buffer, BUFFER_SIZE);
DoSomething(buffer, BUFFER_SIZE);

然后,stream基本上只是调用memcpy()将数据从pb复制到用户buffer中。如果使用ZeroCopyInputStream,我们只需要:

const void* buffer;
int size;
input->Next(&buffer, &size);
DoSomething(buffer, size);

这里不执行拷贝,调用者最终直接从buffer中读取。

ZeroCopyStream提供了两个基类:ZeroCopyOutputStream/ZeroCopyInputStream。

以InputStream为例,通常我们可以通过继承的方式自定义自己的ZerCopyStream,需要实现下面四个接口。

// implements ZeroCopyInputStream ----------------------------------
bool Next(const void** data, int* size);
void BackUp(int count);
bool Skip(int count);
int64 ByteCount() const;

一些rpc框架基本都自定义自己的Stream,例如:sofa-pbrpc

https://github.com/baidu/sofa-pbrpc/blob/master/src/sofa/pbrpc/buffer.h

2.Demo

定义一个pb协议,例如:授权验证:

syntax = "proto3";

message BasicAuth {
  string username = 1;
  string password = 2;
}

随后编写序列化与反序列化:

  • 序列化

BasicAuth auth_message;
auth_message.set_username("user123");
auth_message.set_password("password");

StringOutputStream output_stream(&buf);

auth_message.SerializeToZeroCopyStream(&output_stream);
  • 反序列化

ArrayInputStream input_stream(buf.data(), buf.size());
BasicAuth auth_message;
if (!auth_message.ParseFromZeroCopyStream(&input_stream)) {
    std::cerr << "Failed to parse data." << std::endl;
}

std::cout << "Username: " << auth_message.username() << std::endl;
std::cout << "Password: " << auth_message.password() << std::endl;

随后我们便可以调用它:

int main() {
    std::string buf;
    buf.reserve(512);
    ser(buf);
    deser(buf);
    return 0;
}

输出:

Username: user123
Password: password

本节完,以上完整代码见知识星球,欢迎与我共同探讨rpc相关内容。

7a14b922ebf8af4a31e665c2dc0fe56c.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/938900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Bigemap在公路勘察设计行业中如何应用呢?

选择Bigemap的原因&#xff1a; Google 已经停止使用&#xff0c;天地图清晰度偏低&#xff0c;bigmap可以提供多种不同源的影像、矢量数据。奥维&#xff0c;有接触&#xff0c;做了比选&#xff0c;后来从技术本身去考虑这个问题&#xff0c;影像、矢量数据下载方便&#xf…

命令行环境题目

在后台产生一个ID 不会输出任何东西

Golang Gorm 一对多的添加

一对多的添加有两种情况&#xff1a; 一种是添加用户的时候同时创建文章其次是创建文章关联已经存在的用户。 package mainimport ("gorm.io/driver/mysql""gorm.io/gorm" )// User 用户表 一个用户拥有多篇文章 type User struct {ID int64Name …

强强联袂,产教融合丨知了汇智与成都世纪超体达成战略合作

为了共培数字营销人才&#xff0c;实现产业、教育双向赋能&#xff0c;为地方乃至全国电商发展注入源源不断的行业性人才&#xff0c;8月24日&#xff0c;成都知了汇智科技有限公司&#xff08;以下简称“知了汇智”&#xff09;与成都世纪超体科技有限公司&#xff08;以下简称…

科技资讯|苹果发布新专利:可在车内定位苹果的智能设备

根据美国商标和专利局近期公示的清单&#xff0c;苹果公司获得了一项名为《车内定位移动设备的系统和方式》专利&#xff0c;概述了在车内狭窄空间内如何定位 iPhone 等移动设备。 Find My 服务现阶段没有使用 UWB 来追踪 iPhone 或者 iPad&#xff0c;而是依赖 GPS 等相关辅…

iTubeGo for Mac视频下载器

iTubeGo YouTube Downloader是一款功能强大的YouTube视频下载工具&#xff0c; 它具有以下特色&#xff1a; 多种格式支持&#xff1a;iTubeGo YouTube Downloader可以将YouTube视频下载为多种常见的视频和音频格式&#xff0c;包括MP4、MP3、AVI、FLV、MOV、WMV等&#xff0c…

RFID服装管理系统:点亮时尚世界的新星

今天我们要聊聊一个真正酷炫的系统——RFID服装管理系统。別担心&#xff0c;我会用最地道的方式跟你聊&#xff0c;咱们来解开这神秘的时尚密码吧&#xff01; 首先&#xff0c;先別怕&#xff0c;RFID其实是射频识别技术的缩写。别觉得高大上&#xff0c;其实就是让你的服装…

docker容器查看所有没使用的镜像,并删除

文章目录 场景1. 删除不用的容器删除无效容器2. 删除不用的镜像 场景 最近工作中遇到服务器磁盘紧张的情况&#xff0c;想到docker镜像和容器可以删除些不用的&#xff0c;省出来一些空间。具体操作如下: 1. 删除不用的容器 首先执行命令 docker ps -a 查看容器列表&#xff…

Maven 基础之安装和命令行使用

Maven 的安装和命令行使用 1. 下载安装 下载解压 maven 压缩包&#xff08;http://maven.apache.org/&#xff09; 配置环境变量 前提&#xff1a;需要安装 java 。 在命令行执行如下命令&#xff1a; mvn --version如出现类似如下结果&#xff0c;则证明 maven 安装正确…

ZeroMQ入门

官网: ZeroMQ 简介 ZeroMQ是一个库&#xff0c;不是消息队列也不是消息中间件&#xff0c;介于应用层和传输层之间&#xff08;按照TCP/IP划分&#xff09;。 传统的Socket通信模式需要创建连接&#xff0c;销毁连接&#xff0c;选择协议等一些列操作。而ZeroMQ是在Socket封…

①matlab的命令掌握

目录 输入命令 命名变量 保存和加载变量 使用内置的函数和常量 输入命令 1.您可以通过在命令行窗口中 MATLAB 提示符 (>>) 后输入命令 任务 使用命令 3*5 将数值 3 和 5 相乘。 答案 3*5 2.除非另有指定&#xff0c;否则 MATLAB 会将计算结果存储在一个名为 ans…

No119.精选前端面试题,享受每天的挑战和学习

文章目录 实现栈&#xff0c;有入栈出栈的方法&#xff0c;以及length属性如何封装组件单页应用怎么跨页面传参权限怎么设计的map和forEach对于对象类型会不会改变 实现栈&#xff0c;有入栈出栈的方法&#xff0c;以及length属性 可以通过 JavaScript 的数组来实现一个栈结构…

倒数 2 周|期待 2023 Google开发者大会

9 月 6-7 日&#xff0c;中国上海 前沿科技&#xff0c;新知同享 趣味体验&#xff0c;灵感齐聚 技术生态&#xff0c;多元共进 关注官网最新信息&#xff0c;敬请期待大会开幕 2023 Google 开发者大会官网 相信你一定记得&#xff0c;在今年 5 月的 Google I/O 大会上&am…

考察交流 | 九江市浔阳区委常委、副区长雷霆钧一行考察中创算力

考察交流 8月25日&#xff0c;九江市浔阳区委常委、副区长雷霆钧来访中创算力开展招商考察&#xff0c;中创董事长许伟威热情接待了调研领导一行。浔阳区数字经济发展中心主任曹超成、九江电信浔阳分局局长黄健、九江新联智创董事长刘诚志、德国石荷州中资企业协会副会长陈虹瑾…

SAP从放弃到入门系列之abapGit安装

文章目录 一、概括二、系统环境三、安装独立版本四、安装开发者版本4.1、在线安装&#xff08;推荐&#xff09;4.2、离线安装 前段时间看了汪子熙老师关于abap2UI5的文章&#xff0c;感觉很有意思,来了解一下。abapGit 安装的文章已经有很多了&#xff0c;但是为了在系统里使用…

redis windows 版本安装

1. 下载windows安装包并解压 如果是Linux版本可以直接到官网下载&#xff0c;自3.x起官网和微软网站就没有redis安装包更新了&#xff0c;好在github有开发者在编译发布更新&#xff08;目前最新有5.0.9版本可下&#xff09;&#xff0c;地址&#xff1a;redis windows 5版本下…

即时通讯开发中的5个难点及解决方案

在当今数字化时代&#xff0c;人们越来越依赖即时通讯应用程序进行实时消息传递、语音通话和视频聊天。然而&#xff0c;即时通讯开发并非易事&#xff0c;开发人员需要克服许多技术和功能上的挑战。以下是即时通讯开发过程中最常见的5个难点&#xff0c;以及专家们提出的解决方…

新闻稿发布策略:选择合适渠道,让品牌故事传遍大江南北

新闻稿是企业宣传和传媒报道的重要工具&#xff0c;它可以传达企业的最新动态、产品推出、重要事件等信息。而如何正确发布新闻稿&#xff0c;选择合适的发布渠道&#xff0c;对于提高新闻稿的曝光度和影响力至关重要。在本文中&#xff0c;我们一秒推小编将探讨新闻稿的发布方…

完美解决Ubuntu网络故障,连接异常,IP地址一直显示127.0.0.1

终端输入ifconfig显示虚拟机IP地址为127.0.0.1&#xff0c;具体输出内容如下&#xff1a; wxyubuntu:~$ ifconfig lo: flags73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen …

Linux必备的5款神仙国产软件,让你工作效率成倍提升

随着近些年来国产化计算机的普及&#xff0c;国内的Linux用户逐渐开始多了起来&#xff0c;虽然Linux操作系统的生态不像Windows那么完善&#xff0c;有众多办公软件可以选择&#xff0c;但也有一定数量的软件资源&#xff0c;其中也包括一些优秀的国产软件。下面我将为大家分享…