diff --git a/Makefile b/Makefile index 8757d50..018ae42 100644 --- a/Makefile +++ b/Makefile @@ -24,18 +24,20 @@ $(benchstat): # This compares segmentio/encoding/json to the standard golang encoding/json; # for more in-depth benchmarks, see the `benchmarks` directory. -bench-simple: $(benchstat) - @go test -v -run '^$$' -bench /codeResponse -benchmem -benchtime 3s -cpu 1 ./json -package encoding/json -count 8 | tee /tmp/encoding-json.txt - @go test -v -run '^$$' -bench /codeResponse -benchmem -benchtime 3s -cpu 1 ./json -count 8 | tee /tmp/segmentio-encoding-json.txt - benchstat /tmp/encoding-json.txt /tmp/segmentio-encoding-json.txt +bench-simple: $(benchcmp) + @go test -v -run '^$$' -bench '(Marshal|Unmarshal)$$/codeResponse' -benchmem -cpu 1 -count 5 ./json -package encoding/json | tee encoding-json.txt + @go test -v -run '^$$' -bench '(Marshal|Unmarshal)$$/codeResponse' -benchmem -cpu 1 -count 5 ./json -package github.com/json-iterator/go | tee json-iterator.txt + @go test -v -run '^$$' -bench '(Marshal|Unmarshal)$$/codeResponse' -benchmem -cpu 1 -count 5 ./json | tee segmentio-encoding-json.txt + benchstat encoding-json.txt segmentio-encoding-json.txt + benchstat json-iterator.txt segmentio-encoding-json.txt bench-master: $(benchstat) git stash git checkout master - @go test -v -run '^$$' -bench /codeResponse -benchmem -benchtime 3s -cpu 1 ./json -count 8 | tee /tmp/segmentio-encoding-json-master.txt + @go test -v -run '^$$' -bench /codeResponse -benchmem -cpu 1 ./json -count 5 | tee /tmp/segmentio-encoding-json-master.txt git checkout - git stash pop - @go test -v -run '^$$' -bench /codeResponse -benchmem -benchtime 3s -cpu 1 ./json -count 8 | tee /tmp/segmentio-encoding-json.txt + @go test -v -run '^$$' -bench /codeResponse -benchmem -cpu 1 ./json -count 5 | tee /tmp/segmentio-encoding-json.txt benchstat /tmp/segmentio-encoding-json-master.txt /tmp/segmentio-encoding-json.txt update-golang-test: $(golang.test.files) diff --git a/go.mod b/go.mod index 57a5819..240fe89 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module github.com/segmentio/encoding go 1.14 + +require github.com/json-iterator/go v1.1.10 diff --git a/go.sum b/go.sum index e69de29..836ef80 100644 --- a/go.sum +++ b/go.sum @@ -0,0 +1,14 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/json/json_test.go b/json/json_test.go index 5f3f8a2..f28ba20 100644 --- a/json/json_test.go +++ b/json/json_test.go @@ -19,6 +19,8 @@ import ( "strings" "testing" "time" + + jsoniter "github.com/json-iterator/go" ) // The encoding/json package does not export the msg field of json.SyntaxError, @@ -56,6 +58,19 @@ func TestMain(m *testing.M) { unmarshal = json.Unmarshal + case "github.com/json-iterator/go": + buf := &buffer{} + enc := jsoniter.NewEncoder(buf) + enc.SetEscapeHTML(escapeHTML) + + marshal = func(b []byte, v interface{}) ([]byte, error) { + buf.data = b + err := enc.Encode(v) + return buf.data, err + } + + unmarshal = jsoniter.Unmarshal + default: flags := AppendFlags(0) if escapeHTML {