summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--bufferpool/bufpool.go34
-rw-r--r--helpers/general.go14
2 files changed, 45 insertions, 3 deletions
diff --git a/bufferpool/bufpool.go b/bufferpool/bufpool.go
new file mode 100644
index 000000000..0b7829b2c
--- /dev/null
+++ b/bufferpool/bufpool.go
@@ -0,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)
+}
diff --git a/helpers/general.go b/helpers/general.go
index e409b997a..f2ac253be 100644
--- a/helpers/general.go
+++ b/helpers/general.go
@@ -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()
}