超高性能协议框架fury完爆protostuff(附性能测试对比)

news2024/12/23 13:52:44

简单介绍:
序列化框架是系统通信的基础组件,在大数据、AI 框架和云原生等分布式系统中广泛使用。当对象需要跨进程、跨语言、跨节点传输、持久化、状态读写、复制时,都需要进行序列化,其性能和易用性影响运行效率和开发效率。
Fury 是一个基于 JIT 动态编译和零拷贝的多语言序列化框架,支持 Java/Python/Golang/JavaScript/C++ 等语言,提供全自动的对象多语言 / 跨语言序列化能力。
而提到protostuff,就要先提到Protocol Buffer,它是谷歌出品的一种数据交换格式,独立于语言和平台,类似于json。Google提供了多种语言的实现:java、c++、go和python。对象序列化城Protocol Buffer之后可读性差,但是相比xml,json,它占用小,速度快。适合做数据存储或 RPC 数据交换格式,相对我们常用的json来说,Protocol Buffer门槛更高,因为需要编写.proto文件,再把它编译成目标语言,这样使用起来就很麻烦。但是现在有了protostuff之后,就不需要依赖.proto文件了,他可以直接对POJO进行序列化和反序列化,使用起来非常简单。
今天,我们来做下性能评测:
在这里插入图片描述

fury
官网:https://furyio.org
开源地址:https://github.com/alipay/fury
使用引入:

implementation 'org.furyio:fury-core:0.1.0-SNAPSHOT'

protostuff:
官网:https://protostuff.github.io/
开源地址:https://github.com/protostuff/protostuff
使用引入:

implementation group: 'io.protostuff', name: 'protostuff-core', version: '1.8.0'
implementation group: 'io.protostuff', name: 'protostuff-runtime', version: '1.8.0'

测试设备: win11, 8core,16g memory,
JDK:

openjdk version "11.0.16.1" 2022-08-16
OpenJDK Runtime Environment TencentKonaJDK (build 11.0.16.1+2)
OpenJDK 64-Bit Server VM TencentKonaJDK (build 11.0.16.1+2, mixed mode)

用游戏中高频调用的技能回包做样本,大小范围在512 bytes~1024 bytes,

SkillFire_S2C_Msg[attackerId=1833436122,harmList={HarmDTO[curHp=7557680.5,dead=true,maxHp=7276256.5,real=50382,targetId=1825720823,type=97,value=63549.6],HarmDTO[curHp=2986297.2,dead=true,maxHp=8404842.0,real=89296,targetId=1727245549,type=58,value=51803.74],HarmDTO[curHp=4064384.2,dead=true,maxHp=862263.3,real=11350,targetId=1337388443,type=4,value=6976.12],HarmDTO[curHp=3296058.5,dead=false,maxHp=2449570.5,real=74893,targetId=1757445513,type=44,value=37778.13],HarmDTO[curHp=6212545.0,dead=false,maxHp=7119135.0,real=38610,targetId=1724187257,type=41,value=30361.45],HarmDTO[curHp=5726974.5,dead=false,maxHp=7947759.5,real=1299,targetId=1450442553,type=94,value=69250.14],HarmDTO[curHp=4976733.5,dead=true,maxHp=9860293.0,real=46306,targetId=1324520518,type=2,value=54894.24],HarmDTO[curHp=8698692.0,dead=false,maxHp=3279770.8,real=55874,targetId=1554818116,type=88,value=69794.31],HarmDTO[curHp=5918141.5,dead=false,maxHp=158892.81,real=78468,targetId=1575461297,type=97,value=72174.01]},index=30,param1={2796842,9310196,2734093},skillCategory=ATTACKED_PASSIVE]

对fury和protobuff 从包的大小和吞吐量两个指标做了性能对比:

Benchmark                           Mode   Cnt     Score            Error  Units       bytes
ProtoBenchMark.furyDeserialize      thrpt    5      2599792.187 ± 251936.135  ops/s       776       
ProtoBenchMark.furySerialize         thrpt    5     3176333.674 ± 101602.041  ops/s       280
ProtoBenchMark.protostuffDeserialize  thrpt    5    185185.430   ± 35112.674    ops/s     776
ProtoBenchMark.protostuffSerialize     thrpt    5   150011.192   ±  72814.166    ops/s    141

图形对比:
在这里插入图片描述
对序列化后传输包体大小的各种比较:

SkillFire_S2C_Msg[attackerId=1144770210,harmList={HarmDTO[curHp=7341064.5,dead=false,maxHp=1307891.2,real=39444,targetId=1705354437,type=84,value=5810.02],HarmDTO[curHp=2265639.2,dead=true,maxHp=3791511.8,real=65966,targetId=1234454096,type=49,value=12343.81],HarmDTO[curHp=217945.73,dead=false,maxHp=6192254.5,real=1516,targetId=1991499883,type=51,value=69098.27],HarmDTO[curHp=6802682.0,dead=false,maxHp=3503072.0,real=88600,targetId=1742534863,type=26,value=90365.62],HarmDTO[curHp=1498.77,dead=true,maxHp=1320275.8,real=88398,targetId=1033631343,type=90,value=5265.25],HarmDTO[curHp=4550666.5,dead=true,maxHp=3345442.2,real=20653,targetId=2059955709,type=25,value=89742.31]},index=21,param1={5251655,4692175,1099790,2861,8402466},skillCategory=ATTRIBUTE_ATTRIBUTE]

共 912 bytes,

协议设置压缩率
furyRefTracking=true, Number Compress=false42.87%
furyRefTracking=true, Number Compress=true32.68%
furyRefTracking=false, Number Compress=true32.68%
furyRefTracking=false, Number Compress=true,class register25.66%
furyRefTracking=true, Number Compress=true,class register25.66%
Protostuff23.79%

在引用解析(RefTracking)关闭,类注册 (ClassRegistration)打开,整数压缩(NumberCompressed)打开的情况下,我们再把这个纳入到性能测试案例中,得到了如下的数据(见enhance结尾的数据):

Benchmark                               Mode  Cnt        Score        Error  Units
ProtoBenchMark.furyDeserialize         thrpt    5  4178383.458 ± 125283.184  ops/s
ProtoBenchMark.furyDeserializeEnhance  thrpt    5  2982546.234 ± 311905.075  ops/s
ProtoBenchMark.furySerialize           thrpt    5  2675549.131 ± 117827.214  ops/s
ProtoBenchMark.furySerializeEnhance    thrpt    5  5063335.687 ± 166255.830  ops/s
ProtoBenchMark.protostuffDeserialize   thrpt    5   174876.485 ±  10882.585  ops/s
ProtoBenchMark.protostuffSerialize     thrpt    5   205167.058 ±  12125.220  ops/s

在这里插入图片描述

结论:
吞吐量对比,
在默认引用解析打开,类注册关闭,整数压缩关闭的情况下,序列化上,fury 是protostuff 13 倍,反序列化上 fury 是protostuff 的23.89倍,完胜!
在引用解析关闭,类注册打开,整数压缩打开的情况下,序列化上,fury 提高到了protostuff 24.68 倍,反序列化上 fury 降低到了protostuff 的17.06倍,这个配置策略更适合游戏服务器!
包体压缩比上,在默认情况下,fury 和 protostuff 比较 42.87%> 23.79% , 大了快一倍左右,但在开启整数压缩和类名称注册下,压缩效果明显,达到了25.66%,基本已经接近Protostuff的压缩率。
但奇怪的是,引用解析(RefTracking)关闭和开启,对结果影响不大。
从官方问来了答案:

引用解析(RefTracking):pb之类的框架没法处理重复引用和循环引用,这个功能主要是处理这个的,如果重复对象很多,这个还是有开销的,没重复对象引用建议关闭。

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

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

相关文章

3.2.18 DIR函数的补充说明

【分享成果,随喜正能量】人与人之间都是相互的,你给人搭桥,别人为你铺路;你让人难堪,别人给你添堵。。 我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的劳动效…

【小梦C嘎嘎——启航篇】C++ 基础中的精华(二)

【小梦C嘎嘎——启航篇】C 基础中的精华(二)😎 前言🙌1、引用的使用场景1.1 做参数1.2 做返回值 2、const修饰 的引用2.1 权限上的探讨2.1.1权限放大2.1.2 权限平移2.1.3 全新缩小 4、函数重载的延伸条件编译: 条件编译…

自定义类型详解(C语言)

自定义类型 一. 结构体1.1 什么是结构体1.2 结构体的声明1.3 特殊的声明1.4 结构体的自引用1.5 结构体变量的定义和初始化1.5.1 结构体变量的定义1.5.2 结构体变量的初始化 1.6 结构体内存对齐1.6.1 为什么存在内存对齐 1.7 修改默认对齐数1.8 结构体传参 二. 位段2.1 什么是位…

PVE安装好后拔显卡后连接不了网络

目录 前因 原因 解决办法 前因 前几天装了个​Proxmox​ ve当做一个服务器7*24开机 但是由于转好系统后,显卡就不需要了 加上它耗电的原因(我的gtx650平时空载有10w左右的功耗) 我在想拔显卡拔了,我用xshell进行ssh连接不就…

MVCC:多版本并发控制

MVCC 1. MVCC是什么2. 快照读和当前读2.1 快照读2.2 当前读 3. Read View3.1 Read View中含有什么内容3.2 ReadView的规则 4. MVCC整体操作流程 1. MVCC是什么 MVCC(Multi Version Concurrency Control),多版本并发控制;MVCC用于…

【数学建模】——相关系数

第一部分:皮尔逊相关系数的计算以及数据的描述性统计 本讲我们将介绍两种最为常见的相关系数:皮尔逊person相关系数和斯皮尔曼spearman等级相关系数。它们可以用来衡量两个变量之间的相关性的大小,根据数组满足的不同条件,我们要选…

linux图形界面总结——X、Xorg、WM、QT、GTK、KDE、GNOME的区别与联系

文章目录 一、 linux图形界面二、X协议三、Xfree86 Xorg四、WM(window manager:窗口管理器)五、X协议的Client端实现六、KDE、GNOME、QT和GTK直接关系七、参考: 一、 linux图形界面 linux本身没有图形界面,linux现在的图形界面的实现只是linux下的应用程…

网络类型及数据链路层协议

目录 网络类型的分类 数据链路层协议 MA网络以太网协议 P2P网络 HDLC ---高级数据链路控制协议 更改链路协议的方法 HDLC数据帧封装结构 PPP---点到点协议 PPP协议的优点 PPP数据帧封装结构 PPP会话的搭建 链路建立阶段---LCP建立 认证阶段 网络层协议协商阶段--- NCP协商 网络…

大型风电叶片研发项目管理体系建设实践︱中车时代新材PMO负责人姚运帅

中车株洲时代新材料科技股份有限公司风电运维事业部总经理、PMO负责人姚运帅先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾,演讲议题:大型风电叶片研发项目管理体系建设实践。大会将于8月12-13日在北京举办,敬请关注&#xff01…

sqlserver 存储过程当中如何实现增删改查

--声明存储过程 新增编辑 ALTER procedure [dbo].[Eng_MyAddOrEdtADPro] My_Cocode int, Type int, -- --1 新增 2 编辑 My_KeyId uniqueidentifier, My_PCode int, My_SCode int, My_PName nvarchar(36), My_SName nvarchar(36), My_Orde…

IPUU的小工具拍了拍你(下)

IPUU是埃文科技旗下的综合性IP查询网站,提供多维度的IP数据信息。通过在线查询,用户可以获取目标IP地址的详尽信息,包括位置属性、网络属性、风险属性以及业务属性等,同时还可以查询域名信息。无论您是需要查看某个IP地址归属地&a…

1.13 通过aop日志监控service执行时间

步骤1&#xff1a;添加aop依赖包 <!-- aop切面 依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>步骤2&#xff1a;创建AOP日记监控记录切面类 …

微服务架构——配置中心

「配置中心」&#xff0c;顾名思义&#xff0c;就是用来统一管理项目中所有配置的系统。虽然听起来很简单&#xff0c;但也不要小瞧了这个模块。如果一个中型互联网项目&#xff0c;不采用配置中心的模式&#xff0c;一大堆的各类配置项&#xff0c;各种不定时的修改需求&#…

TMS Aurelius v5.15 Source Crack

TMS Aurelius v5.15 Source Crack 面向Delphi的ORM框架&#xff0c;完全支持数据操作、复杂和高级查询、继承、多态等。。。 功能详细信息 支持多个数据库服务器(MS SQL Server、Firebird、MySQL、DB2、Interbase、Oracle等) 支持多个数据库访问组件(dbExpress、AnyDac、SQLDir…

Linux驱动开发:设备树dts详解

前言&#xff1a;掌握设备树是 Linux 驱动开发人员必备的技能&#xff01;因为在新版本的 Linux 中&#xff0c;ARM 相关的驱动全部采用了设备树(也有支持老式驱动的&#xff0c;比较少)&#xff0c;最新出的 CPU 其驱动开发也基本都是基于设备树的&#xff0c;比如 ST 新出的 …

Stable Diffusion + EbSynth + ControlNet 解决生成视频闪烁

一、安装 1.1、安装ffmpeg 下载地址&#xff1a; 解压&#xff0c;配置环境变量 E:\AI\ffmpeg\bin 检查是否安装成功 1.2、安装SD的 EbSynth 插件 插件地址 https://github.com/s9roll7/ebsynth_utility 报错&#xff1a;ModuleNotFoundError: No module named extension…

后端查询出的数据库数字自动补零和不补零

select CAST(YTD_CHANGE*100 as decimal(18,1)), round(YTD_CHANGE*100,1) from RP where data_date 20211231补零 round(PYTD_CHANGE_PER*100,1)不补零 CAST(PYTD_CHANGE_PER*100 as decimal(18,1))

day39-Oracle分区表

0目录 Oracle分区表 1.2.3 1. Oracle分区表 1.1 作用&#xff1a; Oracle数据库的分区把表中的数据行按照分区划成几个区域&#xff0c;提高大数据量下表的性能 1.2 应用场景&#xff1a;常应用于数据量大的表 1.3 分类&#xff1a;Oracle中有范围分区&#xff08;最常见…

LCD-STM32液晶显示中英文-(5.字符编码)

目录 字符编码 字符编码说明参考网站 字符编码 ASCII编码 ASCII编码介绍 ASCII编码表 中文编码 1. GB2312标准 区位码 2. GBK编码 3. GB18030 各个标准的对比说明 4. Big5编码 字符编码 字符编码说明参考网站 字符编码及转换测试&#xff1a;导航菜单 - 千千秀字 …

代码随想录day6 | 1. 两数之和 454.四数相加II 383.赎金信 15.三数之和 18.四数之和

文章目录 1. 两数之和2. 四数相加II3. 赎金信4. 三数之和5. 四数之和 1. 两数之和 1. 两数之和 虽然是LeetCode第一题&#xff0c;但是还是挺难的&#xff01; 模拟一下&#xff1a; class Solution { public:vector<int> twoSum(vector<int> &nums, int ta…