Add benchmark for medium struct

This commit is contained in:
Masaaki Goshima 2020-07-31 20:24:39 +09:00
parent c14253089e
commit c4c6b6a99d
4 changed files with 150 additions and 15 deletions

View File

@ -118,7 +118,7 @@ func Benchmark_Decode_SmallStruct_Stream_GoJson(b *testing.B) {
} }
} }
func Benchmark_Decode_MediumStruct_EncodingJson(b *testing.B) { func Benchmark_Decode_MediumStruct_Unmarshal_EncodingJson(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
result := MediumPayload{} result := MediumPayload{}
@ -128,7 +128,7 @@ func Benchmark_Decode_MediumStruct_EncodingJson(b *testing.B) {
} }
} }
func Benchmark_Decode_MediumStruct_JsonIter(b *testing.B) { func Benchmark_Decode_MediumStruct_Unmarshal_JsonIter(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
result := MediumPayload{} result := MediumPayload{}
@ -138,7 +138,7 @@ func Benchmark_Decode_MediumStruct_JsonIter(b *testing.B) {
} }
} }
func Benchmark_Decode_MediumStruct_GoJay(b *testing.B) { func Benchmark_Decode_MediumStruct_Unmarshal_GoJay(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
result := MediumPayload{} result := MediumPayload{}
@ -148,7 +148,7 @@ func Benchmark_Decode_MediumStruct_GoJay(b *testing.B) {
} }
} }
func Benchmark_Decode_MediumStruct_GoJayUnsafe(b *testing.B) { func Benchmark_Decode_MediumStruct_Unmarshal_GoJayUnsafe(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
result := MediumPayload{} result := MediumPayload{}
@ -158,7 +158,7 @@ func Benchmark_Decode_MediumStruct_GoJayUnsafe(b *testing.B) {
} }
} }
func Benchmark_Decode_MediumStruct_GoJson(b *testing.B) { func Benchmark_Decode_MediumStruct_Unmarshal_GoJson(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
result := MediumPayload{} result := MediumPayload{}
@ -168,7 +168,7 @@ func Benchmark_Decode_MediumStruct_GoJson(b *testing.B) {
} }
} }
func Benchmark_Decode_MediumStruct_GoJsonNoEscape(b *testing.B) { func Benchmark_Decode_MediumStruct_Unmarshal_GoJsonNoEscape(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
result := MediumPayload{} result := MediumPayload{}
@ -178,7 +178,55 @@ func Benchmark_Decode_MediumStruct_GoJsonNoEscape(b *testing.B) {
} }
} }
func Benchmark_Decode_LargeStruct_EncodingJson(b *testing.B) { func Benchmark_Decode_MediumStruct_Stream_EncodingJson(b *testing.B) {
b.ReportAllocs()
reader := bytes.NewReader(MediumFixture)
for i := 0; i < b.N; i++ {
result := MediumPayload{}
reader.Reset(MediumFixture)
if err := json.NewDecoder(reader).Decode(&result); err != nil {
b.Fatal(err)
}
}
}
func Benchmark_Decode_MediumStruct_Stream_JsonIter(b *testing.B) {
b.ReportAllocs()
reader := bytes.NewReader(MediumFixture)
for i := 0; i < b.N; i++ {
result := MediumPayload{}
reader.Reset(MediumFixture)
if err := jsoniter.NewDecoder(reader).Decode(&result); err != nil {
b.Fatal(err)
}
}
}
func Benchmark_Decode_MediumStruct_Stream_GoJay(b *testing.B) {
b.ReportAllocs()
reader := bytes.NewReader(MediumFixture)
for n := 0; n < b.N; n++ {
reader.Reset(MediumFixture)
result := MediumPayload{}
if err := gojay.NewDecoder(reader).DecodeObject(&result); err != nil {
b.Fatal(err)
}
}
}
func Benchmark_Decode_MediumStruct_Stream_GoJson(b *testing.B) {
b.ReportAllocs()
reader := bytes.NewReader(MediumFixture)
for i := 0; i < b.N; i++ {
result := MediumPayload{}
reader.Reset(MediumFixture)
if err := gojson.NewDecoder(reader).Decode(&result); err != nil {
b.Fatal(err)
}
}
}
func Benchmark_Decode_LargeStruct_Unmarshal_EncodingJson(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
result := LargePayload{} result := LargePayload{}
@ -188,7 +236,7 @@ func Benchmark_Decode_LargeStruct_EncodingJson(b *testing.B) {
} }
} }
func Benchmark_Decode_LargeStruct_JsonIter(b *testing.B) { func Benchmark_Decode_LargeStruct_Unmarshal_JsonIter(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
result := LargePayload{} result := LargePayload{}
@ -198,7 +246,7 @@ func Benchmark_Decode_LargeStruct_JsonIter(b *testing.B) {
} }
} }
func Benchmark_Decode_LargeStruct_GoJay(b *testing.B) { func Benchmark_Decode_LargeStruct_Unmarshal_GoJay(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
result := LargePayload{} result := LargePayload{}
@ -208,7 +256,7 @@ func Benchmark_Decode_LargeStruct_GoJay(b *testing.B) {
} }
} }
func Benchmark_Decode_LargeStruct_GoJayUnsafe(b *testing.B) { func Benchmark_Decode_LargeStruct_Unmarshal_GoJayUnsafe(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
result := LargePayload{} result := LargePayload{}
@ -218,7 +266,7 @@ func Benchmark_Decode_LargeStruct_GoJayUnsafe(b *testing.B) {
} }
} }
func Benchmark_Decode_LargeStruct_GoJson(b *testing.B) { func Benchmark_Decode_LargeStruct_Unmarshal_GoJson(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
result := LargePayload{} result := LargePayload{}
@ -228,7 +276,7 @@ func Benchmark_Decode_LargeStruct_GoJson(b *testing.B) {
} }
} }
func Benchmark_Decode_LargeStruct_GoJsonNoEscape(b *testing.B) { func Benchmark_Decode_LargeStruct_Unmarshal_GoJsonNoEscape(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
result := LargePayload{} result := LargePayload{}

View File

@ -72,6 +72,63 @@ func skipValue(buf []byte, cursor int64) (int64, error) {
return cursor, nil return cursor, nil
} }
continue continue
case 't':
if cursor+3 >= buflen {
return 0, errUnexpectedEndOfJSON("bool of object", cursor)
}
if buf[cursor+1] != 'r' {
return 0, errUnexpectedEndOfJSON("bool of object", cursor)
}
if buf[cursor+2] != 'u' {
return 0, errUnexpectedEndOfJSON("bool of object", cursor)
}
if buf[cursor+3] != 'e' {
return 0, errUnexpectedEndOfJSON("bool of object", cursor)
}
cursor += 4
if bracketCount == 0 && braceCount == 0 {
return cursor, nil
}
continue
case 'f':
if cursor+4 >= buflen {
return 0, errUnexpectedEndOfJSON("bool of object", cursor)
}
if buf[cursor+1] != 'a' {
return 0, errUnexpectedEndOfJSON("bool of object", cursor)
}
if buf[cursor+2] != 'l' {
return 0, errUnexpectedEndOfJSON("bool of object", cursor)
}
if buf[cursor+3] != 's' {
return 0, errUnexpectedEndOfJSON("bool of object", cursor)
}
if buf[cursor+4] != 'e' {
return 0, errUnexpectedEndOfJSON("bool of object", cursor)
}
cursor += 5
if bracketCount == 0 && braceCount == 0 {
return cursor, nil
}
continue
case 'n':
if cursor+3 >= buflen {
return 0, errUnexpectedEndOfJSON("null", cursor)
}
if buf[cursor+1] != 'u' {
return 0, errUnexpectedEndOfJSON("null", cursor)
}
if buf[cursor+2] != 'l' {
return 0, errUnexpectedEndOfJSON("null", cursor)
}
if buf[cursor+3] != 'l' {
return 0, errUnexpectedEndOfJSON("null", cursor)
}
cursor += 4
if bracketCount == 0 && braceCount == 0 {
return cursor, nil
}
continue
} }
cursor++ cursor++
} }

View File

@ -71,10 +71,16 @@ func (s *stream) read() bool {
copy(newBuf, s.buf) copy(newBuf, s.buf)
copy(newBuf[s.length:], buf) copy(newBuf[s.length:], buf)
s.buf = newBuf s.buf = newBuf
s.length = totalSize - 1
} else if s.length > 0 {
copy(buf[s.length:], buf)
copy(buf, s.buf[:s.length])
s.buf = buf
s.length = totalSize - 1
} else { } else {
s.buf = buf s.buf = buf
s.length = totalSize - 1
} }
s.length = int64(len(s.buf)) - 1
s.offset += s.cursor s.offset += s.cursor
if n == 0 { if n == 0 {
return false return false
@ -156,6 +162,30 @@ func (s *stream) skipValue() error {
return nil return nil
} }
continue continue
case 't':
if err := trueBytes(s); err != nil {
return err
}
if bracketCount == 0 && braceCount == 0 {
return nil
}
continue
case 'f':
if err := falseBytes(s); err != nil {
return err
}
if bracketCount == 0 && braceCount == 0 {
return nil
}
continue
case 'n':
if err := nullBytes(s); err != nil {
return err
}
if bracketCount == 0 && braceCount == 0 {
return nil
}
continue
} }
s.cursor++ s.cursor++
} }

View File

@ -88,7 +88,7 @@ func (d *stringDecoder) decodeStreamByte(s *stream) ([]byte, error) {
if err := nullBytes(s); err != nil { if err := nullBytes(s); err != nil {
return nil, err return nil, err
} }
return []byte{'n', 'u', 'l', 'l'}, nil return []byte{}, nil
case nul: case nul:
if s.read() { if s.read() {
continue continue
@ -136,7 +136,7 @@ func (d *stringDecoder) decodeByte(buf []byte, cursor int64) ([]byte, int64, err
return nil, 0, errInvalidCharacter(buf[cursor+3], "null", cursor) return nil, 0, errInvalidCharacter(buf[cursor+3], "null", cursor)
} }
cursor += 5 cursor += 5
return []byte{'n', 'u', 'l', 'l'}, cursor, nil return []byte{}, cursor, nil
default: default:
goto ERROR goto ERROR
} }