為什么要分析gob序列化格式的性能
我自己編的一個(gè)單向同步軟件(https://gitee.com/rocket049/mysync),混合了RPC和HTTP服務(wù)器功能,利用RPC做控制功能,HTTP進(jìn)行數(shù)據(jù)上傳。最近我有意簡(jiǎn)化其構(gòu)造,把其中的http上傳功能也用RPC方式實(shí)現(xiàn)。但是我擔(dān)憂會(huì)導(dǎo)致性能下降,因?yàn)橥ǔ?duì)象序列化,將會(huì)導(dǎo)致數(shù)據(jù)量增加,例如JSON序列化后,二進(jìn)制數(shù)據(jù)變成16進(jìn)制數(shù)據(jù),數(shù)據(jù)量倍增。因此我測(cè)試了gob序列化前后的體量變化。
測(cè)試方法
我編寫了一個(gè)小程序,參數(shù)是輸入文件,把這個(gè)文件轉(zhuǎn)換為一個(gè)結(jié)構(gòu)體,其中包含文件名(strring)和所有數(shù)據(jù)組成的數(shù)組([]byte),然后用golang標(biāo)準(zhǔn)庫(kù)encoding/gob將這個(gè)結(jié)構(gòu)體序列化后保存到另一個(gè)文件中,然后比較輸入文件和輸出文件的大小。
測(cè)試程序
下面是測(cè)試程序的源代碼和用法:
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 輸入文件 > 輸出文件
測(cè)試結(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格式壓縮存儲(chǔ)在結(jié)構(gòu)體中,進(jìn)一步減少了對(duì)帶寬的需求。