1. 程式人生 > 實用技巧 >gob,protobuf,json在golang中的序列化效率對比

gob,protobuf,json在golang中的序列化效率對比

先上程式碼:

looptimes:=10000
	u:=User{66,"nxin","beijing"}
	gobbegintimestamp:=strconv.FormatInt(time.Now().UTC().UnixNano(), 10)
	gobbeginint,_:=strconv.Atoi(gobbegintimestamp)
	fmt.Println("gob序列化==============================",gobbeginint)
	buf := new(bytes.Buffer)   //分配記憶體
	enc := gob.NewEncoder(buf) //建立基於buf記憶體的編碼器
	for i:=0;i<looptimes;i++ {

		err := enc.Encode(u)       //編碼器對結構體編碼
		if err != nil {
			log.Fatal(err)
		}
	}
	gobendtimestamp:=strconv.FormatInt(time.Now().UTC().UnixNano(), 10)
	gobendint,_:=strconv.Atoi(gobendtimestamp)
	fmt.Println("===================END===================",gobendint)

	jsonbegintimestamp:=strconv.FormatInt(time.Now().UTC().UnixNano(), 10)
	jsonbeginint,_:=strconv.Atoi(jsonbegintimestamp)
	fmt.Println("json序列化==============================", jsonbeginint)
	for j:=0;j<looptimes;j++ {
		_, e := json.Marshal(u)
		if e!=nil{
			log.Fatal(e)
		}
	}
	jsonendtimestamp:=strconv.FormatInt(time.Now().UTC().UnixNano(), 10)
	jsonendint,_:=strconv.Atoi(jsonendtimestamp)
	fmt.Println("===================END===================",jsonendint)


	protobufbegintimestamp:=strconv.FormatInt(time.Now().UTC().UnixNano(), 10)
	protobufbeginint,_:=strconv.Atoi(protobufbegintimestamp)
	fmt.Println("protobuf序列化==============================", protobufbeginint)
	hw:=&model.Helloworld{10,"wang","beijing"}
	for j:=0;j<looptimes;j++ {
		_, e := proto.Marshal(hw)
		if e!=nil{
			log.Fatal(e)
		}
	}
	protobufendtimestamp:=strconv.FormatInt(time.Now().UTC().UnixNano(), 10)
	protobufendint,_:=strconv.Atoi(protobufendtimestamp)
	fmt.Println("===================END===================",protobufendint)


	fmt.Println("json:",jsonendint-jsonbeginint)
	fmt.Println("gob:",gobendint-gobbeginint)
	fmt.Println("protobuf:",protobufendint-protobufbeginint)

嘗試了100,1000,10000,100000次的序列化對比時間:

總結:

總體來說protobuf的效率最高,gob的效率比json的還要低。

100次時三者相差不大。

=====================================================================

1000次時三者表現不穩地,測試出來的結果:

以前一種出現的次數更多。

=====================================================================

10000次出現的結果,protobuf效率明顯要高,但是json與gob差別不大:

=====================================================================

100000次出現的結果:

protobuf還是明顯優勢,但是gob有點落後。

綜上所述:在資料量小的時候三者差不多,但是資料量大了以後protobuf會更好,但是gob顯得力不從心,json表現中庸