mirror of
https://github.com/json-iterator/go.git
synced 2025-04-20 11:28:49 +02:00
Previously it would append to the end of the buffer instead of reusing the now-free space. Benchmark demonstrates the improvement, run with -benchtime=10s benchmark old ns/op new ns/op delta Benchmark_encode_string_with_SetEscapeHTML-8 447 442 -1.12% Benchmark_jsoniter_large_file-8 20998 21222 +1.07% Benchmark_json_large_file-8 39593 40187 +1.50% Benchmark_stream_encode_big_object-8 10787 8611 -20.17% benchmark old allocs new allocs delta Benchmark_encode_string_with_SetEscapeHTML-8 6 6 +0.00% Benchmark_jsoniter_large_file-8 78 78 +0.00% Benchmark_json_large_file-8 13 13 +0.00% Benchmark_stream_encode_big_object-8 31 0 -100.00% benchmark old bytes new bytes delta Benchmark_encode_string_with_SetEscapeHTML-8 760 760 +0.00% Benchmark_jsoniter_large_file-8 4920 4920 +0.00% Benchmark_json_large_file-8 6640 6640 +0.00% Benchmark_stream_encode_big_object-8 10056 0 -100.00% Fixes #438
76 lines
2.1 KiB
Go
76 lines
2.1 KiB
Go
package jsoniter
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func Test_writeByte_should_grow_buffer(t *testing.T) {
|
|
should := require.New(t)
|
|
stream := NewStream(ConfigDefault, nil, 1)
|
|
stream.writeByte('1')
|
|
should.Equal("1", string(stream.Buffer()))
|
|
should.Equal(1, len(stream.buf))
|
|
stream.writeByte('2')
|
|
should.Equal("12", string(stream.Buffer()))
|
|
should.Equal(2, len(stream.buf))
|
|
stream.writeThreeBytes('3', '4', '5')
|
|
should.Equal("12345", string(stream.Buffer()))
|
|
}
|
|
|
|
func Test_writeBytes_should_grow_buffer(t *testing.T) {
|
|
should := require.New(t)
|
|
stream := NewStream(ConfigDefault, nil, 1)
|
|
stream.Write([]byte{'1', '2'})
|
|
should.Equal("12", string(stream.Buffer()))
|
|
should.Equal(2, len(stream.buf))
|
|
stream.Write([]byte{'3', '4', '5', '6', '7'})
|
|
should.Equal("1234567", string(stream.Buffer()))
|
|
should.Equal(7, len(stream.buf))
|
|
}
|
|
|
|
func Test_writeIndention_should_grow_buffer(t *testing.T) {
|
|
should := require.New(t)
|
|
stream := NewStream(Config{IndentionStep: 2}.Froze(), nil, 1)
|
|
stream.WriteVal([]int{1, 2, 3})
|
|
should.Equal("[\n 1,\n 2,\n 3\n]", string(stream.Buffer()))
|
|
}
|
|
|
|
func Test_writeRaw_should_grow_buffer(t *testing.T) {
|
|
should := require.New(t)
|
|
stream := NewStream(ConfigDefault, nil, 1)
|
|
stream.WriteRaw("123")
|
|
should.Nil(stream.Error)
|
|
should.Equal("123", string(stream.Buffer()))
|
|
}
|
|
|
|
func Test_writeString_should_grow_buffer(t *testing.T) {
|
|
should := require.New(t)
|
|
stream := NewStream(ConfigDefault, nil, 0)
|
|
stream.WriteString("123")
|
|
should.Nil(stream.Error)
|
|
should.Equal(`"123"`, string(stream.Buffer()))
|
|
}
|
|
|
|
type NopWriter struct {
|
|
bufferSize int
|
|
}
|
|
|
|
func (w *NopWriter) Write(p []byte) (n int, err error) {
|
|
w.bufferSize = cap(p)
|
|
return len(p), nil
|
|
}
|
|
|
|
func Test_flush_buffer_should_stop_grow_buffer(t *testing.T) {
|
|
writer := new(NopWriter)
|
|
NewEncoder(writer).Encode(make([]int, 10000000))
|
|
should := require.New(t)
|
|
|
|
// 512 is the internal buffer size set in NewEncoder
|
|
//
|
|
// Flush is called after each array element, so only the first 8 bytes of it
|
|
// is ever used, and it is never extended. Capacity remains 512.
|
|
should.Equal(512, writer.bufferSize)
|
|
}
|