From bb658fd1b2e7634f1739359a44d1003e7f6ca448 Mon Sep 17 00:00:00 2001 From: Vladimir Varankin Date: Sat, 2 Sep 2017 16:41:07 +0300 Subject: [PATCH] add jsoniter to benchmarks --- .travis.yml | 9 +-- Makefile | 3 +- benchmark/default_test.go | 2 +- benchmark/jsoniter_test.go | 119 +++++++++++++++++++++++++++++++++++++ 4 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 benchmark/jsoniter_test.go diff --git a/.travis.yml b/.travis.yml index 3e5ac13..884f8bb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,9 @@ language: go go: - - tip + - tip install: - - go get github.com/ugorji/go/codec - - go get github.com/pquerna/ffjson/fflib/v1 - - go get github.com/golang/lint/golint + - go get github.com/ugorji/go/codec + - go get github.com/pquerna/ffjson/fflib/v1 + - go get github.com/json-iterator/go + - go get github.com/golang/lint/golint diff --git a/Makefile b/Makefile index 8e720a0..ea591b0 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ export GOPATH all: test -.root/src/$(PKG): +.root/src/$(PKG): mkdir -p $@ for i in $$PWD/* ; do ln -s $$i $@/`basename $$i` ; done @@ -45,6 +45,7 @@ test: generate root bench-other: generate root @go test -benchmem -bench . $(PKG)/benchmark @go test -benchmem -tags use_ffjson -bench . $(PKG)/benchmark + @go test -benchmem -tags use_jsoniter -bench . $(PKG)/benchmark @go test -benchmem -tags use_codec -bench . $(PKG)/benchmark bench-python: diff --git a/benchmark/default_test.go b/benchmark/default_test.go index b647bef..68b3791 100644 --- a/benchmark/default_test.go +++ b/benchmark/default_test.go @@ -1,4 +1,4 @@ -// +build !use_easyjson,!use_ffjson,!use_codec +// +build !use_easyjson,!use_ffjson,!use_codec,!use_jsoniter package benchmark diff --git a/benchmark/jsoniter_test.go b/benchmark/jsoniter_test.go new file mode 100644 index 0000000..004f891 --- /dev/null +++ b/benchmark/jsoniter_test.go @@ -0,0 +1,119 @@ +// +build use_jsoniter + +package benchmark + +import ( + "testing" + + jsoniter "github.com/json-iterator/go" +) + +func BenchmarkJI_Unmarshal_M(b *testing.B) { + b.SetBytes(int64(len(largeStructText))) + for i := 0; i < b.N; i++ { + var s LargeStruct + err := jsoniter.Unmarshal(largeStructText, &s) + if err != nil { + b.Error(err) + } + } +} + +func BenchmarkJI_Unmarshal_S(b *testing.B) { + for i := 0; i < b.N; i++ { + var s Entities + err := jsoniter.Unmarshal(smallStructText, &s) + if err != nil { + b.Error(err) + } + } + b.SetBytes(int64(len(smallStructText))) +} + +func BenchmarkJI_Marshal_M(b *testing.B) { + var l int64 + for i := 0; i < b.N; i++ { + data, err := jsoniter.Marshal(&largeStructData) + if err != nil { + b.Error(err) + } + l = int64(len(data)) + } + b.SetBytes(l) +} + +func BenchmarkJI_Marshal_L(b *testing.B) { + var l int64 + for i := 0; i < b.N; i++ { + data, err := jsoniter.Marshal(&xlStructData) + if err != nil { + b.Error(err) + } + l = int64(len(data)) + } + b.SetBytes(l) +} + +func BenchmarkJI_Marshal_M_Parallel(b *testing.B) { + var l int64 + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + data, err := jsoniter.Marshal(&largeStructData) + if err != nil { + b.Error(err) + } + l = int64(len(data)) + } + }) + b.SetBytes(l) +} + +func BenchmarkJI_Marshal_L_Parallel(b *testing.B) { + var l int64 + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + data, err := jsoniter.Marshal(&xlStructData) + if err != nil { + b.Error(err) + } + l = int64(len(data)) + } + }) + b.SetBytes(l) +} + +func BenchmarkJI_Marshal_S(b *testing.B) { + var l int64 + for i := 0; i < b.N; i++ { + data, err := jsoniter.Marshal(&smallStructData) + if err != nil { + b.Error(err) + } + l = int64(len(data)) + } + b.SetBytes(l) +} + +func BenchmarkJI_Marshal_S_Parallel(b *testing.B) { + var l int64 + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + data, err := jsoniter.Marshal(&smallStructData) + if err != nil { + b.Error(err) + } + l = int64(len(data)) + } + }) + b.SetBytes(l) +} + +func BenchmarkJI_Marshal_M_ToWriter(b *testing.B) { + enc := jsoniter.NewEncoder(&DummyWriter{}) + for i := 0; i < b.N; i++ { + err := enc.Encode(&largeStructData) + if err != nil { + b.Error(err) + } + } +}