Use pooled buffer in replaceShortcodes
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 22 Jun 2015 17:40:12 +0000 (19:40 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 22 Jun 2015 18:30:20 +0000 (20:30 +0200)
Even as a copy at the end is needed, this consumes way less memory on Go 1.4.2:

```benchmark                           old ns/op     new ns/op     delta
BenchmarkParsePage                  145979        139964        -4.12%
BenchmarkReplaceShortcodeTokens     633574        631946        -0.26%
BenchmarkShortcodeLexer             195842        187938        -4.04%

benchmark                           old allocs     new allocs     delta
BenchmarkParsePage                  87             87             +0.00%
BenchmarkReplaceShortcodeTokens     9424           9415           -0.10%
BenchmarkShortcodeLexer             274            274            +0.00%

benchmark                           old bytes     new bytes     delta
BenchmarkParsePage                  141830        141830        +0.00%
BenchmarkReplaceShortcodeTokens     35219         25385         -27.92%
BenchmarkShortcodeLexer             30178         30177         -0.00%
```
See #1148

hugolib/shortcode.go

index 630d17daff9b20fe78b7b4c66ed415e123fd1157..ac1a7f1d3d7e3153d28b78409cf0866019fa99ec 100644 (file)
@@ -458,7 +458,8 @@ func replaceShortcodeTokens(source []byte, prefix string, replacements map[strin
                return source, nil
        }
 
-       var buff bytes.Buffer
+       buff := bp.GetBuffer()
+       defer bp.PutBuffer(buff)
 
        sourceLen := len(source)
        start := 0
@@ -507,7 +508,11 @@ func replaceShortcodeTokens(source []byte, prefix string, replacements map[strin
        if err != nil {
                return nil, errors.New("buff write failed")
        }
-       return buff.Bytes(), nil
+
+       bc := make([]byte, buff.Len(), buff.Len())
+       copy(bc, buff.Bytes())
+
+       return bc, nil
 }
 
 func getShortcodeTemplate(name string, t tpl.Template) *template.Template {