Stop/start benchmark around code that massages vecs into custom structs for encoding.
103 lines
2.2 KiB
Go
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)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|