mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
encoding/gob: use simple append-only buffer for encoding
Bytes buffers have more API and are a little slower. Since appending is a key part of the path in encode, using a faster implementation speeds things up measurably. The couple of positive swings are likely garbage-collection related since memory allocation looks different in the benchmark now. I am not concerned by them. benchmark old ns/op new ns/op delta BenchmarkEndToEndPipe 6620 6388 -3.50% BenchmarkEndToEndByteBuffer 3548 3600 +1.47% BenchmarkEndToEndSliceByteBuffer 336678 367980 +9.30% BenchmarkEncodeComplex128Slice 78199 71297 -8.83% BenchmarkEncodeFloat64Slice 37731 32258 -14.51% BenchmarkEncodeInt32Slice 26780 22977 -14.20% BenchmarkEncodeStringSlice 35882 26492 -26.17% BenchmarkDecodeComplex128Slice 194819 185126 -4.98% BenchmarkDecodeFloat64Slice 120538 120102 -0.36% BenchmarkDecodeInt32Slice 106442 107275 +0.78% BenchmarkDecodeStringSlice 272902 269866 -1.11% LGTM=ruiu R=golang-codereviews, ruiu CC=golang-codereviews https://golang.org/cl/160990043
This commit is contained in:
parent
9965e40220
commit
65dde1ed4b
4 changed files with 59 additions and 35 deletions
|
|
@ -53,7 +53,7 @@ func testError(t *testing.T) {
|
|||
// Test basic encode/decode routines for unsigned integers
|
||||
func TestUintCodec(t *testing.T) {
|
||||
defer testError(t)
|
||||
b := new(bytes.Buffer)
|
||||
b := new(encBuffer)
|
||||
encState := newEncoderState(b)
|
||||
for _, tt := range encodeT {
|
||||
b.Reset()
|
||||
|
|
@ -62,10 +62,10 @@ func TestUintCodec(t *testing.T) {
|
|||
t.Errorf("encodeUint: %#x encode: expected % x got % x", tt.x, tt.b, b.Bytes())
|
||||
}
|
||||
}
|
||||
decState := newDecodeState(b)
|
||||
for u := uint64(0); ; u = (u + 1) * 7 {
|
||||
b.Reset()
|
||||
encState.encodeUint(u)
|
||||
decState := newDecodeState(bytes.NewBuffer(b.Bytes()))
|
||||
v := decState.decodeUint()
|
||||
if u != v {
|
||||
t.Errorf("Encode/Decode: sent %#x received %#x", u, v)
|
||||
|
|
@ -78,10 +78,10 @@ func TestUintCodec(t *testing.T) {
|
|||
|
||||
func verifyInt(i int64, t *testing.T) {
|
||||
defer testError(t)
|
||||
var b = new(bytes.Buffer)
|
||||
var b = new(encBuffer)
|
||||
encState := newEncoderState(b)
|
||||
encState.encodeInt(i)
|
||||
decState := newDecodeState(b)
|
||||
decState := newDecodeState(bytes.NewBuffer(b.Bytes()))
|
||||
decState.buf = make([]byte, 8)
|
||||
j := decState.decodeInt()
|
||||
if i != j {
|
||||
|
|
@ -125,7 +125,7 @@ func newDecodeState(buf *bytes.Buffer) *decoderState {
|
|||
return d
|
||||
}
|
||||
|
||||
func newEncoderState(b *bytes.Buffer) *encoderState {
|
||||
func newEncoderState(b *encBuffer) *encoderState {
|
||||
b.Reset()
|
||||
state := &encoderState{enc: nil, b: b}
|
||||
state.fieldnum = -1
|
||||
|
|
@ -135,7 +135,7 @@ func newEncoderState(b *bytes.Buffer) *encoderState {
|
|||
// Test instruction execution for encoding.
|
||||
// Do not run the machine yet; instead do individual instructions crafted by hand.
|
||||
func TestScalarEncInstructions(t *testing.T) {
|
||||
var b = new(bytes.Buffer)
|
||||
var b = new(encBuffer)
|
||||
|
||||
// bool
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue