개요
- golang에서 다양한 직렬화 벤치마크 테스트
- 간단한 특징 (golang 기준)
- gob: 기본 패키지에 포함, 다른 언어에서 지원 안함
- bson: mongoDB 패키지의 일부
- protobuf: protoc, protoc-gen-go 등 준비할 게 많음
- messagepack: 무난
- 공통점으로는 직렬화 결과물이 바이트 배열
코드
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 코드 생성하는 게 번거로움
참고문헌