為什么要分析gob序列化格式的性能
我自己編的一個(gè)單向同步軟件(https://gitee.com/rocket049/mysync)埂伦,混合了RPC
和HTTP
服務(wù)器功能煞额,利用RPC
做控制功能,HTTP
進(jìn)行數(shù)據(jù)上傳。最近我有意簡化其構(gòu)造膊毁,把其中的http上傳功能也用RPC
方式實(shí)現(xiàn)胀莹。但是我擔(dān)憂會(huì)導(dǎo)致性能下降,因?yàn)橥ǔο笮蛄谢槲拢瑢?huì)導(dǎo)致數(shù)據(jù)量增加描焰,例如JSON
序列化后,二進(jìn)制數(shù)據(jù)變成16進(jìn)制數(shù)據(jù)栅螟,數(shù)據(jù)量倍增荆秦。因此我測試了gob
序列化前后的體量變化。
測試方法
我編寫了一個(gè)小程序嵌巷,參數(shù)是輸入文件,把這個(gè)文件轉(zhuǎn)換為一個(gè)結(jié)構(gòu)體室抽,其中包含文件名(strring
)和所有數(shù)據(jù)組成的數(shù)組([]byte
)搪哪,然后用golang
標(biāo)準(zhǔn)庫encoding/gob
將這個(gè)結(jié)構(gòu)體序列化后保存到另一個(gè)文件中,然后比較輸入文件和輸出文件的大小坪圾。
測試程序
下面是測試程序的源代碼和用法:
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 輸入文件 > 輸出文件
測試結(jié)果
無論輸入文件有多大晓折,輸出文件總是比輸入文件大50個(gè)字節(jié)左右,考慮到保存結(jié)構(gòu)體本身的格式信息的耗費(fèi)兽泄,數(shù)據(jù)量幾乎是不增加的漓概。由此可見,gob
序列化格式非常適合于網(wǎng)絡(luò)傳輸病梢。
基于這個(gè)結(jié)論胃珍,我修改了我程序,把上傳文件的過程用RPC
方式實(shí)現(xiàn)了類似操作系統(tǒng)的文件操作方式:CreateFile->WriteBytes->CloseFile
蜓陌。并且在把文件數(shù)據(jù)序列化之前觅彰,先把文件數(shù)據(jù)用gzip
格式壓縮存儲在結(jié)構(gòu)體中,進(jìn)一步減少了對帶寬的需求钮热。