Adding BufferPool. Implementing BP in ReaderTo{Bytes,String}().
authorspf13 <steve.francia@gmail.com>
Fri, 30 Jan 2015 19:12:07 +0000 (11:12 -0800)
committerspf13 <steve.francia@gmail.com>
Fri, 30 Jan 2015 19:12:07 +0000 (11:12 -0800)
bufferpool/bufpool.go [new file with mode: 0644]
helpers/general.go

diff --git a/bufferpool/bufpool.go b/bufferpool/bufpool.go
new file mode 100644 (file)
index 0000000..0b7829b
--- /dev/null
@@ -0,0 +1,34 @@
+// Copyright © 2013-14 Steve Francia <spf@spf13.com>.
+//
+// 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)
+}
index e409b997a84c99869d60f44a3466bd8711b096d3..f2ac253bed476dcedbdea33d3950945e3d4dc541 100644 (file)
@@ -22,6 +22,8 @@ import (
        "net"
        "path/filepath"
        "strings"
+
+       bp "github.com/spf13/hugo/bufferpool"
 )
 
 // Filepath separator defined by os.Separator.
@@ -68,14 +70,20 @@ func GuessType(in string) string {
 // 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()
 }