shithub: hugo

Download patch

ref: 66ed5c5e02822abb6c48c990681021d02a00a713
parent: d397bc4f43e474529476c8f177e3be4fcd69d593
author: spf13 <[email protected]>
date: Fri Jan 30 06:12:07 EST 2015

Adding BufferPool. Implementing BP in ReaderTo{Bytes,String}().

--- /dev/null
+++ b/bufferpool/bufpool.go
@@ -1,0 +1,34 @@
+// Copyright © 2013-14 Steve Francia <[email protected]>.
+//
+// Licensed under the Simple Public License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://opensource.org/licenses/Simple-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package bufferpool
+
+import (
+	"bytes"
+	"sync"
+)
+
+var bufferPool = &sync.Pool{
+	New: func() interface{} {
+		return &bytes.Buffer{}
+	},
+}
+
+func GetBuffer() (buf *bytes.Buffer) {
+	return bufferPool.Get().(*bytes.Buffer)
+}
+
+func PutBuffer(buf *bytes.Buffer) {
+	buf.Reset()
+	bufferPool.Put(buf)
+}
--- a/helpers/general.go
+++ b/helpers/general.go
@@ -22,6 +22,8 @@
 	"net"
 	"path/filepath"
 	"strings"
+
+	bp "github.com/spf13/hugo/bufferpool"
 )
 
 // Filepath separator defined by os.Separator.
@@ -68,14 +70,20 @@
 // ReaderToBytes takes an io.Reader argument, reads from it
 // and returns bytes.
 func ReaderToBytes(lines io.Reader) []byte {
-	b := new(bytes.Buffer)
+	b := bp.GetBuffer()
+	defer bp.PutBuffer(b)
+
 	b.ReadFrom(lines)
-	return b.Bytes()
+
+	bc := make([]byte, b.Len(), b.Len())
+	copy(bc, b.Bytes())
+	return bc
 }
 
 // ReaderToString is the same as ReaderToBytes, but returns a string.
 func ReaderToString(lines io.Reader) string {
-	b := new(bytes.Buffer)
+	b := bp.GetBuffer()
+	defer bp.PutBuffer(b)
 	b.ReadFrom(lines)
 	return b.String()
 }