golang專有的gob序列化性能分析

為什么要分析gob序列化格式的性能

我自己編的一個(gè)單向同步軟件(https://gitee.com/rocket049/mysync),混合了RPCHTTP服務(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ì)帶寬的需求。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容