rustperf/src/vec3_test.go
Bill Thiede 05b8898d9f Try to use ffjson with custom encoder, but it's even slower?!
Stop/start benchmark around code that massages vecs into custom structs
for encoding.
2019-11-19 21:48:48 -08:00

103 lines
2.2 KiB
Go

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)
}
}
})
}
}