Skip to content

Commit

Permalink
add benchmarks
Browse files Browse the repository at this point in the history
  • Loading branch information
AsterDY committed Nov 6, 2023
1 parent f993bbd commit eb1f9e4
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 14 deletions.
36 changes: 22 additions & 14 deletions internal/decoder/stream.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@
package decoder

import (
"bytes"
"io"
"sync"

"github.com/bytedance/sonic/internal/native"
"github.com/bytedance/sonic/internal/native/types"
"github.com/bytedance/sonic/internal/rt"
"github.com/bytedance/sonic/option"
`bytes`
`io`
`sync`

`github.com/bytedance/sonic/internal/native`
`github.com/bytedance/sonic/internal/native/types`
`github.com/bytedance/sonic/internal/rt`
`github.com/bytedance/sonic/option`
)

var (
Expand Down Expand Up @@ -81,7 +81,7 @@ func (self *StreamDecoder) Decode(val interface{}) (err error) {
} else {
// println("no more")
err = SyntaxError{e, self.s, types.ParsingError(-s), ""}
self.err = err
self.setErr(err)
return
}
} else {
Expand All @@ -94,18 +94,20 @@ func (self *StreamDecoder) Decode(val interface{}) (err error) {
self.Decoder.Reset(string(self.buf[s:e]))
err = self.Decoder.Decode(val)
if err != nil {
self.err = err
self.setErr(err)
return
}

self.scanp = e
_, empty := self.scan()
if empty {
// println("recycle")
// no remain valid bytes, thus we just recycle buffer
mem := self.buf
self.buf = nil
bufPool.Put(mem[:0])
} else {
// println("keep")
// remain undecoded bytes, move them onto head
n := copy(self.buf, self.buf[self.scanp:])
self.buf = self.buf[:n]
Expand Down Expand Up @@ -166,12 +168,18 @@ func (self *StreamDecoder) readMore() bool {

// buffer has been scanned, now report any error
if err != nil {
self.err = err
self.setErr(err)
return false
}
}
}

func (self *StreamDecoder) setErr(err error) {
self.err = err
mem := self.buf[:0]
self.buf = nil
bufPool.Put(mem)
}

func (self *StreamDecoder) peek() (byte, error) {
var err error
Expand All @@ -182,7 +190,7 @@ func (self *StreamDecoder) peek() (byte, error) {
}
// buffer has been scanned, now report any error
if err != nil {
self.err = err
self.setErr(err)
return 0, err
}
err = self.refill()
Expand Down Expand Up @@ -236,8 +244,8 @@ func realloc(buf *[]byte) bool {
if c - l <= c >> minLeftBufferShift {
// println("realloc!")
e := l+(l>>minLeftBufferShift)
if e < option.DefaultDecoderBufferSize {
e = option.DefaultDecoderBufferSize
if e <= c {
e = c*2
}
tmp := make([]byte, l, e)
copy(tmp, *buf)
Expand Down
32 changes: 32 additions & 0 deletions internal/decoder/stream_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ var (
_Double_JSON = `{"aaaaa":"` + strings.Repeat("b", int(DefaultBufferSize)) + `"}` + strings.Repeat(" ", int(DefaultBufferSize)) + `{"11111":"` + strings.Repeat("2", int(DefaultBufferSize)) + `"}`
_Triple_JSON = `{"aaaaa":"` + strings.Repeat("b", int(DefaultBufferSize)) + `"}{ } {"11111":"` +
strings.Repeat("2", int(DefaultBufferSize))+`"} b {}`
_SMALL_JSON = `{"a":"b"} [1] {"c":"d"} [2]`
)

func TestStreamError(t *testing.T) {
Expand Down Expand Up @@ -250,6 +251,21 @@ func BenchmarkDecodeStream_Std(b *testing.B) {
_ = dc.Decode(&v1)
}
})

b.Run("small", func (b *testing.B) {
var str = _SMALL_JSON
for i:=0; i<b.N; i++ {
var r1 = strings.NewReader(str)
var v1 interface{}
dc := json.NewDecoder(r1)
for dc.More() {
e := dc.Decode(&v1)
if e != nil {
b.Fatal(e)
}
}
}
})
}

// func BenchmarkDecodeError_Sonic(b *testing.B) {
Expand Down Expand Up @@ -314,4 +330,20 @@ func BenchmarkDecodeStream_Sonic(b *testing.B) {
_ = dc.Decode(&v1)
}
})

b.Run("small", func (b *testing.B) {
var str = _SMALL_JSON
for i:=0; i<b.N; i++ {
// println("one loop")
var r1 = strings.NewReader(str)
var v1 interface{}
dc := NewStreamDecoder(r1)
for dc.More() {
e := dc.Decode(&v1)
if e != nil {
b.Fatal(e)
}
}
}
})
}

0 comments on commit eb1f9e4

Please sign in to comment.