You've already forked json-iterator
mirror of
https://github.com/json-iterator/go.git
synced 2025-06-15 22:50:24 +02:00
Revert "WIP: Tests to compare against stdlib"
This commit is contained in:
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T bool
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T bool
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T byte
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T byte
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T float32
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T float32
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T float64
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T float64
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T int16
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T int16
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T int32
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T int32
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T int8
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T int8
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T string
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T string
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T uint16
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T uint16
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T uint32
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T uint32
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T uint8
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T uint8
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[int32]bool
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[int32]byte
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[int32]float32
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[int32]float64
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[int32]int32
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[int32]int8
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[int32]string
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type StringAlias string
|
|
||||||
|
|
||||||
type T map[int32]StringAlias
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[int32]uint8
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[string]bool
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[string]byte
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[string]float32
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[string]float64
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[string]int32
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[string]int8
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[string]string
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type StringAlias string
|
|
||||||
|
|
||||||
type T map[string]StringAlias
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[string]uint8
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type StringAlias string
|
|
||||||
|
|
||||||
type T map[StringAlias]bool
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type StringAlias string
|
|
||||||
|
|
||||||
type T map[StringAlias]byte
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type StringAlias string
|
|
||||||
|
|
||||||
type T map[StringAlias]float32
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type StringAlias string
|
|
||||||
|
|
||||||
type T map[StringAlias]float64
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type StringAlias string
|
|
||||||
|
|
||||||
type T map[StringAlias]int32
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type StringAlias string
|
|
||||||
|
|
||||||
type T map[StringAlias]int8
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type StringAlias string
|
|
||||||
|
|
||||||
type T map[StringAlias]string
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type StringAlias string
|
|
||||||
|
|
||||||
type T map[StringAlias]StringAlias
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type StringAlias string
|
|
||||||
|
|
||||||
type T map[StringAlias]uint8
|
|
@ -1,144 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
|
||||||
fuzz "github.com/google/gofuzz"
|
|
||||||
jsoniter "github.com/json-iterator/go"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Roundtrip(t *testing.T) {
|
|
||||||
fz := fuzz.New().MaxDepth(10).NilChance(0.3)
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
var before T
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
|
|
||||||
jbStd, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
jbIter, err := jsoniter.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to marshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if string(jbStd) != string(jbIter) {
|
|
||||||
t.Errorf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
|
|
||||||
indent(jbStd, " "), indent(jbIter, " "), dump(before))
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterStd T
|
|
||||||
err = json.Unmarshal(jbIter, &afterStd)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with stdlib: %v", err)
|
|
||||||
}
|
|
||||||
var afterIter T
|
|
||||||
err = jsoniter.Unmarshal(jbIter, &afterIter)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to unmarshal with jsoniter: %v", err)
|
|
||||||
}
|
|
||||||
if fingerprint(afterStd) != fingerprint(afterIter) {
|
|
||||||
t.Errorf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
|
|
||||||
dump(afterStd), dump(afterIter), indent(jbIter, " "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const indentStr = "> "
|
|
||||||
|
|
||||||
func fingerprint(obj interface{}) string {
|
|
||||||
c := spew.ConfigState{
|
|
||||||
SortKeys: true,
|
|
||||||
SpewKeys: true,
|
|
||||||
}
|
|
||||||
return c.Sprintf("%v", obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(obj interface{}) string {
|
|
||||||
cfg := spew.ConfigState{
|
|
||||||
Indent: indentStr,
|
|
||||||
}
|
|
||||||
return cfg.Sdump(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func indent(src []byte, prefix string) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
json.Indent(&buf, src, prefix, indentStr)
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := json.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkStandardUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = json.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterMarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var obj T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&obj)
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
jb, err := jsoniter.Marshal(obj)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal:\n input: %s\n error: %v", dump(obj), err)
|
|
||||||
}
|
|
||||||
_ = jb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkJSONIterUnmarshal(t *testing.B) {
|
|
||||||
t.ReportAllocs()
|
|
||||||
t.ResetTimer()
|
|
||||||
|
|
||||||
var before T
|
|
||||||
fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3)
|
|
||||||
fz.Fuzz(&before)
|
|
||||||
jb, err := json.Marshal(before)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < t.N; i++ {
|
|
||||||
var after T
|
|
||||||
err = jsoniter.Unmarshal(jb, &after)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to unmarshal:\n input: %q\n error: %v", string(jb), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
package test
|
|
||||||
|
|
||||||
type T map[uint8]bool
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user