测试了一下编解码的执行效果

简介: 测试了一下编解码的执行效果

背景


有热心朋友反馈:


protosbuff支持的类型少~而且不支持嵌套~性能更没有json高,如不是外网使用节约流量,没有用的必要~


我觉得评论说的很好。但是以淘金式思路来看这个问题,需要提出自己的问题,进行批判性吸收。

 

编码效率


1112728-20190420064039240-1171904481.png


写了一段代码测试使用protostuff和json两种序列化编码的执行速度。结果每次protostuff的速度都比json快。下面是其中3次的结果:


1112728-20190420064010959-414356374.png


(结果1)


1112728-20190420063947239-516474643.png


(结果2)


1112728-20190420063925368-1922869936.png


(结果3)


结论:protostuff编码速度快于json。


这个数据让我非常的自责,因为可以看到编码的速度在100ms上下,是非常耗时的操作。但是我在编写我们项目代码的时候没有加专门的监控统计。


为了验证是否和执行顺序有关,调换一下执行顺序。实际上如果在同一个方法里先后运行两次序列化,会影响执行结果。但是因为用了两个独立的junit test方法,所以影响可忽略不计。来看看效果。


1112728-20190420063900451-1620078220.png


这是修改了顺序的代码。下面是其中3次的结果:


1112728-20190420063835159-1897851487.png


(结果1)


1112728-20190420063808071-1142484830.png


(结果2)


1112728-20190420063743529-1805773531.png


(结果3)


可以看到,protostuff编码速度仍然快于json。

 

解码效率



1112728-20190420063720129-2021055685.png


改造一下代码,测试一下解码效率。


1112728-20190420063652998-420907368.png


(结果1)


1112728-20190420063633692-362867014.png


(结果2)


1112728-20190420063601718-2142522607.png


(结果3)


结论:protostuff解码速度远远快于json。

 

编码后的大小



1112728-20190420063513222-1124346234.png


结果:


1112728-20190420063445685-555419404.png


结论:protostuff编码后的数据小于json。


换一个复杂对象验证效果:


1112728-20190420063412633-988498923.png


结果:


1112728-20190420063343004-1169354969.png


又换了一个更复杂的,结果:


1112728-20190420063327643-504633511.png


虽然protostuff编码后的数据小于json。但是相差不是很大。这是因为刚才所有的测试(包括效率和大小)都是基于我将protostuff编解码和base64绑定处理了。


1112728-20190420063304027-1084507331.png


这是编码。


1112728-20190420063233308-1684323116.png


这是解码。如果不用base64,最后一条的结果是


1112728-20190420063209273-732460032.png


protostuff的优势还是很明显的。


关于支持的类型少和不支持嵌套。看上面我用到的对象Pod,是

io.fabric8.kubernetes.api.model.Pod,有k8s背景的朋友应该知道这个对象有多复杂。测试里面的ResourceMessage对象其实是个泛型对象,里面嵌套了Pod。所以也不存在不支持嵌套这一说。

相关文章
|
6月前
|
缓存 编译器
BOLT 二进制反馈优化技术
大型应用的代码往往达到数十甚至上百MB,这导致在程序执行时缓存机制无法充分利用,导致大量时间花费在CPU和内存链路上。通过对热点函数的布局进行优化,我们可以更好地利用CPU cache,从而获得较为可观的性能提升。针对这一问题,在编译技术上有PGO和Bolt两种解决办法,两者都是一种通过收集程序在运行时如跳转,调用关系,函数热度等执行信息,这些收集到的程序运行情况数据(profile data),可以更好地指导一些程序优化的策略,如是否对函数进行内联,以及对基本块和函数布局的排布来提高特定场景下的程序性能。
1209 2
BOLT 二进制反馈优化技术
|
6月前
|
算法 数据处理 开发者
FFmpeg库的使用与深度解析:解码音频流流程
FFmpeg库的使用与深度解析:解码音频流流程
104 0
|
域名解析 网络协议 测试技术
性能测试-弱网测试参数选择标准
在当今移动互联网盛行的时代,网络的形态除了有线连接,还有2G/3G/Edge/4G/Wifi等多种手机网络连接方式。不同的协议、不同的制式、不同的速率,使移动应用运行的场景更加丰富。
10512 0
性能测试-弱网测试参数选择标准
|
5月前
|
测试技术 UED
Mock 工具使用 - 模拟弱网测试
在移动互联网时代,弱网测试至关重要,尤其面对多样化的网络环境和应用场景,如2G, 3G, 4G及弱信号WiFi。弱网通常指低于3G的网络或弱信号WiFi。Charles工具能方便地模拟不同网络条件,包括带宽、丢包和延迟,以进行功能测试和优化用户体验。通过Proxy -> Throttle Setting启用限制,选择预设或自定义参数(如下载速度、带宽和延迟)进行测试。通过基础模拟和定制设置,确保移动端应用在弱网环境下的稳定性和性能。
|
6月前
|
IDE 编译器 C语言
【C++】使用g++指令控制【翻译】各个过程
【C++】使用g++指令控制【翻译】各个过程
|
异构计算
【FPGA】基本实验步骤演示 | Verilog编码 | 运行合成 | 设备/引脚分配 | 综合/实施 | 设备配置 | 以最简单的逻辑非为例
【FPGA】基本实验步骤演示 | Verilog编码 | 运行合成 | 设备/引脚分配 | 综合/实施 | 设备配置 | 以最简单的逻辑非为例
103 0
|
编解码 负载均衡 测试技术
使用i9-9880H测试h264/265编解码开销
使用i9-9880H测试h264/265编解码开销
102 0
|
缓存 调度
HLS开发学习-12- for 循环优化(二)
HLS开发学习-12- for 循环优化(二)
343 0
HLS开发学习-12- for 循环优化(二)
|
存储 算法 异构计算
HLS开发学习-11- for 循环优化(一)
HLS开发学习-11- for 循环优化(一)
373 0
HLS开发学习-11- for 循环优化(一)
|
前端开发 测试技术