zoukankan      html  css  js  c++  java
  • 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表现中庸

  • 相关阅读:
    docker 容器卷及提交
    docker 容器命令及解析
    docker镜像常用命令及解析
    drf 中集成swgger api功能文档
    drf 二次封装Response
    drf 中 自定义 异常处理方法
    drf 中自定义登录 以及token验证
    drf_vue对接极验验证
    django 信号的使用
    element plut tree renderContent
  • 原文地址:https://www.cnblogs.com/ExMan/p/13933322.html
Copyright © 2011-2022 走看看