[Go] 직렬화 성능 비교

natae·2022년 8월 24일
0

Golang

목록 보기
7/11

개요

  • golang에서 다양한 직렬화 벤치마크 테스트
  • 간단한 특징 (golang 기준)
    • gob: 기본 패키지에 포함, 다른 언어에서 지원 안함
    • bson: mongoDB 패키지의 일부
    • protobuf: protoc, protoc-gen-go 등 준비할 게 많음
    • messagepack: 무난
  • 공통점으로는 직렬화 결과물이 바이트 배열

코드

// go 1.18
package study

import (
	"bytes"
	"codeTest/study/myproto/pb"
	"encoding/gob"
	"math/rand"
	"strconv"
	"testing"

	"github.com/vmihailenco/msgpack/v5"
	"go.mongodb.org/mongo-driver/bson"
	"google.golang.org/protobuf/proto"
)

func BenchmarkMessagePack(b *testing.B) {
	for i := 0; i < b.N; i++ {
		str := strconv.Itoa(rand.Int())

		bytes, err := msgpack.Marshal(&Person{Name: str, Id: int32(rand.Int())})
		if err != nil {
			panic(err)
		}

		var person Person
		err = msgpack.Unmarshal(bytes, &person)
		if err != nil {
			panic(err)
		}
	}
}

func BenchmarkGob(b *testing.B) {
	var buffer bytes.Buffer
	encoder := gob.NewEncoder(&buffer)
	decoder := gob.NewDecoder(&buffer)

	for i := 0; i < b.N; i++ {
		str := strconv.Itoa(rand.Int())

		err := encoder.Encode(&Person{Name: str, Id: int32(rand.Int())})
		if err != nil {
			panic(err)
		}

		var person Person

		err = decoder.Decode(&person)
		if err != nil {
			panic(err)
		}
	}

}

func BenchmarkBson(b *testing.B) {
	for i := 0; i < b.N; i++ {
		str := strconv.Itoa(rand.Int())

		bytes, err := bson.Marshal(&Person{Name: str, Id: int32(rand.Int())})
		if err != nil {
			panic(err)
		}

		var person Person

		err = bson.Unmarshal(bytes, &person)
		if err != nil {
			panic(err)
		}
	}
}

func BenchmarkProtobuf(b *testing.B) {
	for i := 0; i < b.N; i++ {
		str := strconv.Itoa(rand.Int())

		bytes, err := proto.Marshal(&pb.Person{Name: str, Id: int32(rand.Int())})
		if err != nil {
			panic(err)
		}

		person := &pb.Person{}

		err = proto.Unmarshal(bytes, person)
		if err != nil {
			panic(err)
		}
	}
}

type Person struct {
	Name string
	Id   int32
}

출력

$ go test -bench . -benchmem              
goos: darwin
goarch: arm64
pkg: codeTest/study
BenchmarkMessagePack-8   	 2491353	       455.0 ns/op	     256 B/op	       7 allocs/op
BenchmarkGob-8           	 3361693	       357.4 ns/op	      95 B/op	       4 allocs/op
BenchmarkBson-8          	 1827640	       659.0 ns/op	     408 B/op	      14 allocs/op
BenchmarkProtobuf-8      	 5114824	       234.7 ns/op	     207 B/op	       5 allocs/op
PASS
ok  	codeTest/study	6.865s

결론

  • 속도 기준
    • protobuf > gob > messagepack > bson
  • 메모리 기준
    • gob > protobuf > messagepack > bson
  • 종합
    • gob > protobuf > messagepack > bson
      • 이유: protobuf 코드 생성하는 게 번거로움

참고문헌

profile
서버 프로그래머

0개의 댓글