為什麼要分析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
格式壓縮儲存在結構體中,進一步減少了對頻寬的需求。