diff --git a/jx.go b/jx.go index 24996eb..db0fbdc 100644 --- a/jx.go +++ b/jx.go @@ -19,6 +19,11 @@ var ( return &Encoder{} }, } + writerPool = &sync.Pool{ + New: func() interface{} { + return &Writer{} + }, + } decPool = &sync.Pool{ New: func() interface{} { return &Decoder{} @@ -48,3 +53,14 @@ func PutEncoder(e *Encoder) { e.SetIdent(0) encPool.Put(e) } + +// GetWriter returns *Writer from pool. +func GetWriter() *Writer { + return writerPool.Get().(*Writer) +} + +// PutWriter puts *Writer to pool +func PutWriter(e *Writer) { + e.Reset() + writerPool.Put(e) +} diff --git a/otel_test.go b/otel_test.go index 300b879..4fed95d 100644 --- a/otel_test.go +++ b/otel_test.go @@ -327,14 +327,17 @@ func BenchmarkOTEL(b *testing.B) { } }) b.Run("Write", func(b *testing.B) { + w := GetWriter() + defer PutWriter(w) + v.Write(w) + b.ReportAllocs() - var w Writer - v.Write(&w) b.SetBytes(int64(len(w.Buf))) + b.ResetTimer() for i := 0; i < b.N; i++ { w.Reset() - v.Write(&w) + v.Write(w) } }) b.Run("Encode", func(b *testing.B) { diff --git a/w_test.go b/w_test.go index a0825f1..5c701b0 100644 --- a/w_test.go +++ b/w_test.go @@ -7,7 +7,9 @@ import ( ) func TestWriter_Reset(t *testing.T) { - var w Writer + w := GetWriter() + defer PutWriter(w) + w.True() require.NotEmpty(t, w.Buf) w.Reset() @@ -15,6 +17,9 @@ func TestWriter_Reset(t *testing.T) { } func TestWriter_String(t *testing.T) { - w := Writer{Buf: []byte(`true`)} + w := GetWriter() + defer PutWriter(w) + + w.True() require.Equal(t, "true", w.String()) }