From c32cca3a4febc2520b4e548434a089c9843af66d Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Mon, 30 Mar 2015 19:20:46 -0700 Subject: [PATCH] wal: reduce allocation when encoding entries --- wal/encoder.go | 24 +++++++++++++++++++++--- wal/wal.go | 1 + 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/wal/encoder.go b/wal/encoder.go index ca0df44a0..ceee34220 100644 --- a/wal/encoder.go +++ b/wal/encoder.go @@ -30,12 +30,15 @@ type encoder struct { bw *bufio.Writer crc hash.Hash32 + buf []byte } func newEncoder(w io.Writer, prevCrc uint32) *encoder { return &encoder{ bw: bufio.NewWriter(w), crc: crc.New(prevCrc, crcTable), + // 1MB buffer + buf: make([]byte, 1024*1024), } } @@ -45,9 +48,23 @@ func (e *encoder) encode(rec *walpb.Record) error { e.crc.Write(rec.Data) rec.Crc = e.crc.Sum32() - data, err := rec.Marshal() - if err != nil { - return err + var ( + data []byte + err error + n int + ) + + if rec.Size() > len(e.buf) { + data, err = rec.Marshal() + if err != nil { + return err + } + } else { + n, err = rec.MarshalTo(e.buf) + if err != nil { + return err + } + data = e.buf[:n] } if err := writeInt64(e.bw, int64(len(data))); err != nil { return err @@ -63,5 +80,6 @@ func (e *encoder) flush() error { } func writeInt64(w io.Writer, n int64) error { + // TODO: use putuint64 to reduce two alloctions return binary.Write(w, binary.LittleEndian, n) } diff --git a/wal/wal.go b/wal/wal.go index d242647ee..1bc2f2c4e 100644 --- a/wal/wal.go +++ b/wal/wal.go @@ -387,6 +387,7 @@ func (w *WAL) Close() error { } func (w *WAL) saveEntry(e *raftpb.Entry) error { + // TODO: add MustMarshalTo to reduce one allocation. b := pbutil.MustMarshal(e) rec := &walpb.Record{Type: entryType, Data: b} if err := w.encoder.encode(rec); err != nil {