package vec3 import ( "encoding/json" "reflect" "testing" "github.com/francoispqt/gojay" jsoniter "github.com/json-iterator/go" "github.com/pquerna/ffjson/ffjson" "xinu.tv/rustperf/src/ffjsonvec3" ) type testFunc struct { name string f func(start, stop func(), vs []Vec3) ([]byte, error) } var encodeFuncs = []testFunc{ {"HandRolled", func(_, _ func(), vs []Vec3) ([]byte, error) { return HandRolled(vs) }}, {"stdlib", func(_, _ func(), vs []Vec3) ([]byte, error) { return json.Marshal(vs) }}, {"ffjsonvec3", func(start, stop func(), vs []Vec3) ([]byte, error) { stop() var vecs []ffjsonvec3.Vec3 for _, v := range vs { v := ffjsonvec3.Vec3{ X: v.X, Y: v.Y, Z: v.Z, } vecs = append(vecs, v) } start() return ffjson.Marshal(vecs) }}, {"ffjson", func(_, _ func(), vs []Vec3) ([]byte, error) { return ffjson.Marshal(vs) }}, {"iterator", func(_, _ func(), vs []Vec3) ([]byte, error) { var js = jsoniter.ConfigCompatibleWithStandardLibrary return js.Marshal(vs) }}, {"gojay", func(start, stop func(), vs []Vec3) ([]byte, error) { stop() var vecs Vec3Slice for _, v := range vs { v := v vecs = append(vecs, &v) } start() return gojay.Marshal(&vecs) }}, } func TestVec3ToJSON(t *testing.T) { vecs := []Vec3{ {X: 1.0, Y: 2.0, Z: 3.0}, {X: 4.5, Y: 5.0, Z: 6.0}, } for _, ts := range encodeFuncs { t.Run(ts.name, func(t *testing.T) { stop := func() {} start := func() {} got, err := ts.f(start, stop, vecs) if err != nil { t.Fatalf("Failed to marshal: %v", err) } want := []byte(`[{"x":1,"y":2,"z":3},{"x":4.5,"y":5,"z":6}]`) if !reflect.DeepEqual(want, got) { t.Fatalf("got != want\nGot: %s\nWant: %s", got, want) } }) } } func BenchmarkVec3ToJSON(b *testing.B) { var vecs []Vec3 for i := 0; i < 1000; i++ { vecs = append(vecs, Vec3{ X: 255. * float32(i) / 1000., Y: 255. * float32(i) / 1000., Z: 255. * float32(i) / 1000., }) } for _, ts := range encodeFuncs { b.Run(ts.name, func(b *testing.B) { stop := func() { b.StopTimer() } start := func() { b.StartTimer() } for i := 0; i < b.N; i++ { if _, err := ts.f(start, stop, vecs); err != nil { b.Fatalf("Failed to marshal: %v", err) } } }) } }