From 8f56cffd86204b7debff7c5cea3ddc8a8c9d0a2e Mon Sep 17 00:00:00 2001 From: Ignacio Hagopian Date: Sun, 11 Aug 2019 17:47:26 -0300 Subject: [PATCH] codec: collapse write and save extra alloc (#64) --- internal/codec.go | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/internal/codec.go b/internal/codec.go index e43ac14..6044e55 100644 --- a/internal/codec.go +++ b/internal/codec.go @@ -28,28 +28,21 @@ type Encoder struct { // Encode takes any Entry and streams it to the underlying writer. // Messages are framed with a key-length and value-length prefix. func (e *Encoder) Encode(msg Entry) (int64, error) { - var bufKeyValue = make([]byte, ValueSize) - - bufKeySize := bufKeyValue[:KeySize] - binary.BigEndian.PutUint32(bufKeySize, uint32(len(msg.Key))) - if _, err := e.w.Write(bufKeySize); err != nil { - return 0, errors.Wrap(err, "failed writing key length prefix") + var bufKeyValue = make([]byte, KeySize+ValueSize) + binary.BigEndian.PutUint32(bufKeyValue[:KeySize], uint32(len(msg.Key))) + binary.BigEndian.PutUint64(bufKeyValue[KeySize:KeySize+ValueSize], uint64(len(msg.Value))) + if _, err := e.w.Write(bufKeyValue); err != nil { + return 0, errors.Wrap(err, "failed writing key & value length prefix") } - bufValueSize := bufKeyValue[:ValueSize] - binary.BigEndian.PutUint64(bufValueSize, uint64(len(msg.Value))) - if _, err := e.w.Write(bufValueSize); err != nil { - return 0, errors.Wrap(err, "failed writing value length prefix") - } - - if _, err := e.w.Write([]byte(msg.Key)); err != nil { + if _, err := e.w.Write(msg.Key); err != nil { return 0, errors.Wrap(err, "failed writing key data") } if _, err := e.w.Write(msg.Value); err != nil { return 0, errors.Wrap(err, "failed writing value data") } - bufChecksumSize := make([]byte, checksumSize) + bufChecksumSize := bufKeyValue[:checksumSize] binary.BigEndian.PutUint32(bufChecksumSize, msg.Checksum) if _, err := e.w.Write(bufChecksumSize); err != nil { return 0, errors.Wrap(err, "failed writing checksum data")