Compare commits
4 Commits
7707ff9660
...
bacc6fa3f4
| Author | SHA1 | Date | |
|---|---|---|---|
| bacc6fa3f4 | |||
| 05b8898d9f | |||
| 68088ceb3f | |||
| 6289413a60 |
15
README.md
15
README.md
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
running 2 tests
|
running 2 tests
|
||||||
test vec3::tests::test_vec3_to_json ... ignored
|
test vec3::tests::test_vec3_to_json ... ignored
|
||||||
test vec3::tests::bench_vec3_to_json ... bench: 181,127 ns/iter (+/- 37,666)
|
test vec3::tests::bench_vec3_to_json ... bench: 185,886 ns/iter (+/- 38,485)
|
||||||
|
|
||||||
test result: ok. 0 passed; 0 failed; 1 ignored; 1 measured; 0 filtered out
|
test result: ok. 0 passed; 0 failed; 1 ignored; 1 measured; 0 filtered out
|
||||||
|
|
||||||
@ -24,11 +24,12 @@ test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
|
|||||||
goos: linux
|
goos: linux
|
||||||
goarch: amd64
|
goarch: amd64
|
||||||
pkg: xinu.tv/rustperf/src
|
pkg: xinu.tv/rustperf/src
|
||||||
BenchmarkVec3ToJSON/HandRolled-8 3042 338000 ns/op
|
BenchmarkVec3ToJSON/HandRolled-8 3230 332941 ns/op
|
||||||
BenchmarkVec3ToJSON/stdlib-8 2754 459788 ns/op
|
BenchmarkVec3ToJSON/stdlib-8 2607 462978 ns/op
|
||||||
BenchmarkVec3ToJSON/ffjson-8 2697 457685 ns/op
|
BenchmarkVec3ToJSON/ffjsonvec3-8 976 1206295 ns/op
|
||||||
BenchmarkVec3ToJSON/iterator-8 2542 483460 ns/op
|
BenchmarkVec3ToJSON/ffjson-8 2692 455898 ns/op
|
||||||
BenchmarkVec3ToJSON/gojay-8 1303 905583 ns/op
|
BenchmarkVec3ToJSON/iterator-8 2562 486984 ns/op
|
||||||
|
BenchmarkVec3ToJSON/gojay-8 1444 832129 ns/op
|
||||||
PASS
|
PASS
|
||||||
ok xinu.tv/rustperf/src 6.989s
|
ok xinu.tv/rustperf/src 7.626s
|
||||||
```
|
```
|
||||||
|
|||||||
3
go.sum
3
go.sum
@ -15,6 +15,7 @@ github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7
|
|||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||||
@ -69,6 +70,7 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE
|
|||||||
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
|
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
|
||||||
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
|
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20=
|
github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20=
|
||||||
github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M=
|
github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M=
|
||||||
@ -104,6 +106,7 @@ github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:Udh
|
|||||||
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
|
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
|
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
|
||||||
github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU=
|
github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU=
|
||||||
|
|||||||
7
src/ffjsonvec3/vec3.go
Normal file
7
src/ffjsonvec3/vec3.go
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package ffjsonvec3
|
||||||
|
|
||||||
|
type Vec3 struct {
|
||||||
|
X float32 `json:"x"`
|
||||||
|
Y float32 `json:"y"`
|
||||||
|
Z float32 `json:"z"`
|
||||||
|
}
|
||||||
315
src/ffjsonvec3/vec3_ffjson.go
Normal file
315
src/ffjsonvec3/vec3_ffjson.go
Normal file
@ -0,0 +1,315 @@
|
|||||||
|
// Code generated by ffjson <https://github.com/pquerna/ffjson>. DO NOT EDIT.
|
||||||
|
// source: vec3.go
|
||||||
|
|
||||||
|
package ffjsonvec3
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
fflib "github.com/pquerna/ffjson/fflib/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MarshalJSON marshal bytes to json - template
|
||||||
|
func (j *Vec3) MarshalJSON() ([]byte, error) {
|
||||||
|
var buf fflib.Buffer
|
||||||
|
if j == nil {
|
||||||
|
buf.WriteString("null")
|
||||||
|
return buf.Bytes(), nil
|
||||||
|
}
|
||||||
|
err := j.MarshalJSONBuf(&buf)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return buf.Bytes(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSONBuf marshal buff to json - template
|
||||||
|
func (j *Vec3) MarshalJSONBuf(buf fflib.EncodingBuffer) error {
|
||||||
|
if j == nil {
|
||||||
|
buf.WriteString("null")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
var obj []byte
|
||||||
|
_ = obj
|
||||||
|
_ = err
|
||||||
|
buf.WriteString(`{"x":`)
|
||||||
|
fflib.AppendFloat(buf, float64(j.X), 'g', -1, 32)
|
||||||
|
buf.WriteString(`,"y":`)
|
||||||
|
fflib.AppendFloat(buf, float64(j.Y), 'g', -1, 32)
|
||||||
|
buf.WriteString(`,"z":`)
|
||||||
|
fflib.AppendFloat(buf, float64(j.Z), 'g', -1, 32)
|
||||||
|
buf.WriteByte('}')
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
ffjtVec3base = iota
|
||||||
|
ffjtVec3nosuchkey
|
||||||
|
|
||||||
|
ffjtVec3X
|
||||||
|
|
||||||
|
ffjtVec3Y
|
||||||
|
|
||||||
|
ffjtVec3Z
|
||||||
|
)
|
||||||
|
|
||||||
|
var ffjKeyVec3X = []byte("x")
|
||||||
|
|
||||||
|
var ffjKeyVec3Y = []byte("y")
|
||||||
|
|
||||||
|
var ffjKeyVec3Z = []byte("z")
|
||||||
|
|
||||||
|
// UnmarshalJSON umarshall json - template of ffjson
|
||||||
|
func (j *Vec3) UnmarshalJSON(input []byte) error {
|
||||||
|
fs := fflib.NewFFLexer(input)
|
||||||
|
return j.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSONFFLexer fast json unmarshall - template ffjson
|
||||||
|
func (j *Vec3) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error {
|
||||||
|
var err error
|
||||||
|
currentKey := ffjtVec3base
|
||||||
|
_ = currentKey
|
||||||
|
tok := fflib.FFTok_init
|
||||||
|
wantedTok := fflib.FFTok_init
|
||||||
|
|
||||||
|
mainparse:
|
||||||
|
for {
|
||||||
|
tok = fs.Scan()
|
||||||
|
// println(fmt.Sprintf("debug: tok: %v state: %v", tok, state))
|
||||||
|
if tok == fflib.FFTok_error {
|
||||||
|
goto tokerror
|
||||||
|
}
|
||||||
|
|
||||||
|
switch state {
|
||||||
|
|
||||||
|
case fflib.FFParse_map_start:
|
||||||
|
if tok != fflib.FFTok_left_bracket {
|
||||||
|
wantedTok = fflib.FFTok_left_bracket
|
||||||
|
goto wrongtokenerror
|
||||||
|
}
|
||||||
|
state = fflib.FFParse_want_key
|
||||||
|
continue
|
||||||
|
|
||||||
|
case fflib.FFParse_after_value:
|
||||||
|
if tok == fflib.FFTok_comma {
|
||||||
|
state = fflib.FFParse_want_key
|
||||||
|
} else if tok == fflib.FFTok_right_bracket {
|
||||||
|
goto done
|
||||||
|
} else {
|
||||||
|
wantedTok = fflib.FFTok_comma
|
||||||
|
goto wrongtokenerror
|
||||||
|
}
|
||||||
|
|
||||||
|
case fflib.FFParse_want_key:
|
||||||
|
// json {} ended. goto exit. woo.
|
||||||
|
if tok == fflib.FFTok_right_bracket {
|
||||||
|
goto done
|
||||||
|
}
|
||||||
|
if tok != fflib.FFTok_string {
|
||||||
|
wantedTok = fflib.FFTok_string
|
||||||
|
goto wrongtokenerror
|
||||||
|
}
|
||||||
|
|
||||||
|
kn := fs.Output.Bytes()
|
||||||
|
if len(kn) <= 0 {
|
||||||
|
// "" case. hrm.
|
||||||
|
currentKey = ffjtVec3nosuchkey
|
||||||
|
state = fflib.FFParse_want_colon
|
||||||
|
goto mainparse
|
||||||
|
} else {
|
||||||
|
switch kn[0] {
|
||||||
|
|
||||||
|
case 'x':
|
||||||
|
|
||||||
|
if bytes.Equal(ffjKeyVec3X, kn) {
|
||||||
|
currentKey = ffjtVec3X
|
||||||
|
state = fflib.FFParse_want_colon
|
||||||
|
goto mainparse
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'y':
|
||||||
|
|
||||||
|
if bytes.Equal(ffjKeyVec3Y, kn) {
|
||||||
|
currentKey = ffjtVec3Y
|
||||||
|
state = fflib.FFParse_want_colon
|
||||||
|
goto mainparse
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'z':
|
||||||
|
|
||||||
|
if bytes.Equal(ffjKeyVec3Z, kn) {
|
||||||
|
currentKey = ffjtVec3Z
|
||||||
|
state = fflib.FFParse_want_colon
|
||||||
|
goto mainparse
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if fflib.SimpleLetterEqualFold(ffjKeyVec3Z, kn) {
|
||||||
|
currentKey = ffjtVec3Z
|
||||||
|
state = fflib.FFParse_want_colon
|
||||||
|
goto mainparse
|
||||||
|
}
|
||||||
|
|
||||||
|
if fflib.SimpleLetterEqualFold(ffjKeyVec3Y, kn) {
|
||||||
|
currentKey = ffjtVec3Y
|
||||||
|
state = fflib.FFParse_want_colon
|
||||||
|
goto mainparse
|
||||||
|
}
|
||||||
|
|
||||||
|
if fflib.SimpleLetterEqualFold(ffjKeyVec3X, kn) {
|
||||||
|
currentKey = ffjtVec3X
|
||||||
|
state = fflib.FFParse_want_colon
|
||||||
|
goto mainparse
|
||||||
|
}
|
||||||
|
|
||||||
|
currentKey = ffjtVec3nosuchkey
|
||||||
|
state = fflib.FFParse_want_colon
|
||||||
|
goto mainparse
|
||||||
|
}
|
||||||
|
|
||||||
|
case fflib.FFParse_want_colon:
|
||||||
|
if tok != fflib.FFTok_colon {
|
||||||
|
wantedTok = fflib.FFTok_colon
|
||||||
|
goto wrongtokenerror
|
||||||
|
}
|
||||||
|
state = fflib.FFParse_want_value
|
||||||
|
continue
|
||||||
|
case fflib.FFParse_want_value:
|
||||||
|
|
||||||
|
if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null {
|
||||||
|
switch currentKey {
|
||||||
|
|
||||||
|
case ffjtVec3X:
|
||||||
|
goto handle_X
|
||||||
|
|
||||||
|
case ffjtVec3Y:
|
||||||
|
goto handle_Y
|
||||||
|
|
||||||
|
case ffjtVec3Z:
|
||||||
|
goto handle_Z
|
||||||
|
|
||||||
|
case ffjtVec3nosuchkey:
|
||||||
|
err = fs.SkipField(tok)
|
||||||
|
if err != nil {
|
||||||
|
return fs.WrapErr(err)
|
||||||
|
}
|
||||||
|
state = fflib.FFParse_after_value
|
||||||
|
goto mainparse
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
goto wantedvalue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handle_X:
|
||||||
|
|
||||||
|
/* handler: j.X type=float32 kind=float32 quoted=false*/
|
||||||
|
|
||||||
|
{
|
||||||
|
if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null {
|
||||||
|
return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float32", tok))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
if tok == fflib.FFTok_null {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
tval, err := fflib.ParseFloat(fs.Output.Bytes(), 32)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fs.WrapErr(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
j.X = float32(tval)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
state = fflib.FFParse_after_value
|
||||||
|
goto mainparse
|
||||||
|
|
||||||
|
handle_Y:
|
||||||
|
|
||||||
|
/* handler: j.Y type=float32 kind=float32 quoted=false*/
|
||||||
|
|
||||||
|
{
|
||||||
|
if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null {
|
||||||
|
return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float32", tok))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
if tok == fflib.FFTok_null {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
tval, err := fflib.ParseFloat(fs.Output.Bytes(), 32)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fs.WrapErr(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
j.Y = float32(tval)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
state = fflib.FFParse_after_value
|
||||||
|
goto mainparse
|
||||||
|
|
||||||
|
handle_Z:
|
||||||
|
|
||||||
|
/* handler: j.Z type=float32 kind=float32 quoted=false*/
|
||||||
|
|
||||||
|
{
|
||||||
|
if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null {
|
||||||
|
return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float32", tok))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
if tok == fflib.FFTok_null {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
tval, err := fflib.ParseFloat(fs.Output.Bytes(), 32)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fs.WrapErr(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
j.Z = float32(tval)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
state = fflib.FFParse_after_value
|
||||||
|
goto mainparse
|
||||||
|
|
||||||
|
wantedvalue:
|
||||||
|
return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok))
|
||||||
|
wrongtokenerror:
|
||||||
|
return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String()))
|
||||||
|
tokerror:
|
||||||
|
if fs.BigError != nil {
|
||||||
|
return fs.WrapErr(fs.BigError)
|
||||||
|
}
|
||||||
|
err = fs.Error.ToError()
|
||||||
|
if err != nil {
|
||||||
|
return fs.WrapErr(err)
|
||||||
|
}
|
||||||
|
panic("ffjson-generated: unreachable, please report bug.")
|
||||||
|
done:
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
53
src/vec3.go
Normal file
53
src/vec3.go
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package vec3
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/francoispqt/gojay"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Vec3 struct {
|
||||||
|
X float32 `json:"x"`
|
||||||
|
Y float32 `json:"y"`
|
||||||
|
Z float32 `json:"z"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Vec3) MarshalJSONObject(enc *gojay.Encoder) {
|
||||||
|
enc.FloatKey("x", float64(v.X))
|
||||||
|
enc.FloatKey("y", float64(v.Y))
|
||||||
|
enc.FloatKey("z", float64(v.Z))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Vec3) IsNil() bool {
|
||||||
|
return v == nil
|
||||||
|
}
|
||||||
|
func HandRolled(vs []Vec3) ([]byte, error) {
|
||||||
|
buf := []byte("[")
|
||||||
|
for i, v := range vs {
|
||||||
|
if i > 0 {
|
||||||
|
buf = append(buf, []byte(`,{"x":`)...)
|
||||||
|
} else {
|
||||||
|
buf = append(buf, []byte(`{"x":`)...)
|
||||||
|
}
|
||||||
|
buf = strconv.AppendFloat(buf, float64(v.X), 'f', -1, 32)
|
||||||
|
buf = append(buf, []byte(`,"y":`)...)
|
||||||
|
buf = strconv.AppendFloat(buf, float64(v.Y), 'f', -1, 32)
|
||||||
|
buf = append(buf, []byte(`,"z":`)...)
|
||||||
|
buf = strconv.AppendFloat(buf, float64(v.Z), 'f', -1, 32)
|
||||||
|
buf = append(buf, []byte("}")...)
|
||||||
|
}
|
||||||
|
buf = append(buf, ']')
|
||||||
|
return buf, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type Vec3Slice []*Vec3
|
||||||
|
|
||||||
|
func (vs *Vec3Slice) MarshalJSONArray(enc *gojay.Encoder) {
|
||||||
|
for _, e := range *vs {
|
||||||
|
enc.AddObject(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (vs Vec3Slice) IsNil() bool {
|
||||||
|
return vs == nil
|
||||||
|
}
|
||||||
149
src/vec3_test.go
149
src/vec3_test.go
@ -1,61 +1,60 @@
|
|||||||
package main
|
package vec3
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/francoispqt/gojay"
|
"github.com/francoispqt/gojay"
|
||||||
jsoniter "github.com/json-iterator/go"
|
jsoniter "github.com/json-iterator/go"
|
||||||
"github.com/pquerna/ffjson/ffjson"
|
"github.com/pquerna/ffjson/ffjson"
|
||||||
|
"xinu.tv/rustperf/src/ffjsonvec3"
|
||||||
)
|
)
|
||||||
|
|
||||||
func HandRolled(vs []Vec3) ([]byte, error) {
|
type testFunc struct {
|
||||||
buf := []byte("[")
|
name string
|
||||||
for i, v := range vs {
|
f func(start, stop func(), vs []Vec3) ([]byte, error)
|
||||||
if i > 0 {
|
}
|
||||||
buf = append(buf, []byte(`,{"x":`)...)
|
|
||||||
} else {
|
var encodeFuncs = []testFunc{
|
||||||
buf = append(buf, []byte(`{"x":`)...)
|
{"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)
|
||||||
}
|
}
|
||||||
buf = strconv.AppendFloat(buf, float64(v.X), 'f', -1, 32)
|
start()
|
||||||
buf = append(buf, []byte(`,"y":`)...)
|
|
||||||
buf = strconv.AppendFloat(buf, float64(v.Y), 'f', -1, 32)
|
|
||||||
buf = append(buf, []byte(`,"z":`)...)
|
|
||||||
buf = strconv.AppendFloat(buf, float64(v.Z), 'f', -1, 32)
|
|
||||||
buf = append(buf, []byte("}")...)
|
|
||||||
}
|
|
||||||
buf = append(buf, ']')
|
|
||||||
return buf, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type Vec3 struct {
|
return ffjson.Marshal(vecs)
|
||||||
X float32 `json:"x"`
|
}},
|
||||||
Y float32 `json:"y"`
|
{"ffjson", func(_, _ func(), vs []Vec3) ([]byte, error) {
|
||||||
Z float32 `json:"z"`
|
return ffjson.Marshal(vs)
|
||||||
}
|
}},
|
||||||
|
{"iterator", func(_, _ func(), vs []Vec3) ([]byte, error) {
|
||||||
func (v *Vec3) MarshalJSONObject(enc *gojay.Encoder) {
|
var js = jsoniter.ConfigCompatibleWithStandardLibrary
|
||||||
enc.FloatKey("x", float64(v.X))
|
return js.Marshal(vs)
|
||||||
enc.FloatKey("y", float64(v.Y))
|
}},
|
||||||
enc.FloatKey("z", float64(v.Z))
|
{"gojay", func(start, stop func(), vs []Vec3) ([]byte, error) {
|
||||||
}
|
stop()
|
||||||
|
var vecs Vec3Slice
|
||||||
func (v *Vec3) IsNil() bool {
|
for _, v := range vs {
|
||||||
return v == nil
|
v := v
|
||||||
}
|
vecs = append(vecs, &v)
|
||||||
|
}
|
||||||
type Vec3Slice []*Vec3
|
start()
|
||||||
|
return gojay.Marshal(&vecs)
|
||||||
func (vs *Vec3Slice) MarshalJSONArray(enc *gojay.Encoder) {
|
}},
|
||||||
for _, e := range *vs {
|
|
||||||
enc.AddObject(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vs Vec3Slice) IsNil() bool {
|
|
||||||
return vs == nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestVec3ToJSON(t *testing.T) {
|
func TestVec3ToJSON(t *testing.T) {
|
||||||
@ -64,33 +63,11 @@ func TestVec3ToJSON(t *testing.T) {
|
|||||||
{X: 4.5, Y: 5.0, Z: 6.0},
|
{X: 4.5, Y: 5.0, Z: 6.0},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, ts := range []struct {
|
for _, ts := range encodeFuncs {
|
||||||
name string
|
|
||||||
f func([]Vec3) ([]byte, error)
|
|
||||||
}{
|
|
||||||
{"HandRolled", HandRolled},
|
|
||||||
{"stdlib", func(vs []Vec3) ([]byte, error) {
|
|
||||||
return json.Marshal(vs)
|
|
||||||
}},
|
|
||||||
{"ffjson", func(vs []Vec3) ([]byte, error) {
|
|
||||||
return ffjson.Marshal(vecs)
|
|
||||||
}},
|
|
||||||
{"iterator", func(vs []Vec3) ([]byte, error) {
|
|
||||||
var js = jsoniter.ConfigCompatibleWithStandardLibrary
|
|
||||||
return js.Marshal(vecs)
|
|
||||||
}},
|
|
||||||
{"gojay", func(vs []Vec3) ([]byte, error) {
|
|
||||||
var vecs Vec3Slice
|
|
||||||
for _, v := range vs {
|
|
||||||
v := v
|
|
||||||
vecs = append(vecs, &v)
|
|
||||||
}
|
|
||||||
|
|
||||||
return gojay.Marshal(&vecs)
|
|
||||||
}},
|
|
||||||
} {
|
|
||||||
t.Run(ts.name, func(t *testing.T) {
|
t.Run(ts.name, func(t *testing.T) {
|
||||||
got, err := ts.f(vecs)
|
stop := func() {}
|
||||||
|
start := func() {}
|
||||||
|
got, err := ts.f(start, stop, vecs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to marshal: %v", err)
|
t.Fatalf("Failed to marshal: %v", err)
|
||||||
}
|
}
|
||||||
@ -111,34 +88,12 @@ func BenchmarkVec3ToJSON(b *testing.B) {
|
|||||||
Z: 255. * float32(i) / 1000.,
|
Z: 255. * float32(i) / 1000.,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
for _, ts := range []struct {
|
for _, ts := range encodeFuncs {
|
||||||
name string
|
|
||||||
f func([]Vec3) ([]byte, error)
|
|
||||||
}{
|
|
||||||
{"HandRolled", HandRolled},
|
|
||||||
{"stdlib", func(vs []Vec3) ([]byte, error) {
|
|
||||||
return json.Marshal(vs)
|
|
||||||
}},
|
|
||||||
{"ffjson", func(vs []Vec3) ([]byte, error) {
|
|
||||||
return ffjson.Marshal(vecs)
|
|
||||||
}},
|
|
||||||
{"iterator", func(vs []Vec3) ([]byte, error) {
|
|
||||||
var js = jsoniter.ConfigCompatibleWithStandardLibrary
|
|
||||||
return js.Marshal(vecs)
|
|
||||||
}},
|
|
||||||
{"gojay", func(vs []Vec3) ([]byte, error) {
|
|
||||||
var vecs Vec3Slice
|
|
||||||
for _, v := range vs {
|
|
||||||
v := v
|
|
||||||
vecs = append(vecs, &v)
|
|
||||||
}
|
|
||||||
|
|
||||||
return gojay.Marshal(&vecs)
|
|
||||||
}},
|
|
||||||
} {
|
|
||||||
b.Run(ts.name, func(b *testing.B) {
|
b.Run(ts.name, func(b *testing.B) {
|
||||||
|
stop := func() { b.StopTimer() }
|
||||||
|
start := func() { b.StartTimer() }
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
if _, err := ts.f(vecs); err != nil {
|
if _, err := ts.f(start, stop, vecs); err != nil {
|
||||||
b.Fatalf("Failed to marshal: %v", err)
|
b.Fatalf("Failed to marshal: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user