reuse allocated buffer (#271)

* reuse buffer  avoid allocate

* reuse buffer clean

* typo

* reuse buf size 512
diff --git a/encode.go b/encode.go
index b6d9aed..cd3e11a 100644
--- a/encode.go
+++ b/encode.go
@@ -21,9 +21,7 @@
 	"reflect"
 	"time"
 	"unsafe"
-)
 
-import (
 	perrors "github.com/pkg/errors"
 )
 
@@ -56,6 +54,22 @@
 	e.refMap = make(map[unsafe.Pointer]_refElem, 7)
 }
 
+// ReuseBufferClean reuse the Encoder for a new object encoding.
+// it reuse allocated buffer and reduce memory-allocation.
+func (e *Encoder) ReuseBufferClean() {
+	var buffer []byte
+	if cap(e.buffer) <= 512 {
+		// reuse buffer, avoid allocate
+		buffer = e.buffer[:0]
+	} else {
+		// avoiding memory leak caused by growth of underlying array
+		buffer = make([]byte, 64)
+	}
+	e.classInfoList = nil
+	e.buffer = buffer[:0]
+	e.refMap = make(map[unsafe.Pointer]_refElem, 7)
+}
+
 // Buffer returns byte buffer
 func (e *Encoder) Buffer() []byte {
 	return e.buffer[:]