Skip to content

Commit

Permalink
json_encoder: re-use a *json.Encoder and *bytes.Buffer for reflection
Browse files Browse the repository at this point in the history
  • Loading branch information
Joshua T Corbin committed Jun 18, 2018
1 parent 7e6877f commit 930a571
Showing 1 changed file with 24 additions and 4 deletions.
28 changes: 24 additions & 4 deletions zapcore/json_encoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,13 @@ func getJSONEncoder() *jsonEncoder {
}

func putJSONEncoder(enc *jsonEncoder) {
enc.reflectBuf.Free()
enc.EncoderConfig = nil
enc.buf = nil
enc.spaced = false
enc.openNamespaces = 0
enc.reflectBuf = nil
enc.reflectEnc = nil
_jsonPool.Put(enc)
}

Expand All @@ -56,6 +59,10 @@ type jsonEncoder struct {
buf *buffer.Buffer
spaced bool // include spaces after colons and commas
openNamespaces int

// for encoding generic values by reflection
reflectBuf *buffer.Buffer
reflectEnc *json.Encoder
}

// NewJSONEncoder creates a fast, low-allocation JSON encoder. The encoder
Expand Down Expand Up @@ -124,13 +131,24 @@ func (enc *jsonEncoder) AddInt64(key string, val int64) {
enc.AppendInt64(val)
}

func (enc *jsonEncoder) resetReflectBuf() {
if enc.reflectBuf == nil {
enc.reflectBuf = bufferpool.Get()
enc.reflectEnc = json.NewEncoder(enc.reflectBuf)
} else {
enc.reflectBuf.Reset()
}
}

func (enc *jsonEncoder) AddReflected(key string, obj interface{}) error {
marshaled, err := json.Marshal(obj)
enc.resetReflectBuf()
err := enc.reflectEnc.Encode(obj)
if err != nil {
return err
}
enc.reflectBuf.TrimNewline()
enc.addKey(key)
_, err = enc.buf.Write(marshaled)
_, err = enc.buf.Write(enc.reflectBuf.Bytes())
return err
}

Expand Down Expand Up @@ -213,12 +231,14 @@ func (enc *jsonEncoder) AppendInt64(val int64) {
}

func (enc *jsonEncoder) AppendReflected(val interface{}) error {
marshaled, err := json.Marshal(val)
enc.resetReflectBuf()
err := enc.reflectEnc.Encode(val)
if err != nil {
return err
}
enc.reflectBuf.TrimNewline()
enc.addElementSeparator()
_, err = enc.buf.Write(marshaled)
_, err = enc.buf.Write(enc.reflectBuf.Bytes())
return err
}

Expand Down

0 comments on commit 930a571

Please sign in to comment.