为什么要分析gob序列化格式的性能
我自己编的一个单向同步软件(https://gitee.com/rocket049/mysync),混合了RPC
和HTTP
服务器功能,利用RPC
做控制功能,HTTP
进行数据上传。最近我有意简化其构造,把其中的http上传功能也用RPC
方式实现。但是我担忧会导致性能下降,因为通常对象序列化,将会导致数据量增加,例如JSON
序列化后,二进制数据变成16进制数据,数据量倍增。因此我测试了gob
序列化前后的体量变化。
测试方法
我编写了一个小程序,参数是输入文件,把这个文件转换为一个结构体,其中包含文件名(strring
)和所有数据组成的数组([]byte
),然后用golang
标准库encoding/gob
将这个结构体序列化后保存到另一个文件中,然后比较输入文件和输出文件的大小。
测试程序
下面是测试程序的源代码和用法:
import ( "encoding/gob" "io/ioutil" "os") type FileAll struct{ Name string Cxt []byte }func main(){ var fa1 FileAll var err error fa1.Name = os.Args[1] fa1.Cxt,err = ioutil.ReadFile( os.Args[1] ) if err != nil{ panic(err) } enc := gob.NewEncoder(os.Stdout) enc.Encode(fa1) }
用法:gob1 输入文件 > 输出文件
测试结果
无论输入文件有多大,输出文件总是比输入文件大50个字节左右,考虑到保存结构体本身的格式信息的耗费,数据量几乎是不增加的。由此可见,gob
序列化格式非常适合于网络传输。
基于这个结论,我修改了我程序,把上传文件的过程用RPC
方式实现了类似操作系统的文件操作方式:CreateFile->WriteBytes->CloseFile
。并且在把文件数据序列化之前,先把文件数据用gzip
格式压缩存储在结构体中,进一步减少了对带宽的需求。
作者:从火星来
链接:https://www.jianshu.com/p/72a06d1fe1dc
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦