hugolib: Rewrite replaceDivider to reduce memory allocation

```bash
name              old time/op    new time/op    delta
ReplaceDivider-4   9.76µs ±105%    7.96µs ±24%     ~     (p=0.690 n=5+5)

name              old alloc/op   new alloc/op   delta
ReplaceDivider-4    3.46kB ± 0%    1.54kB ± 0%  -55.56%  (p=0.008 n=5+5)

name              old allocs/op  new allocs/op  delta
ReplaceDivider-4      6.00 ± 0%      1.00 ± 0%  -83.33%  (p=0.008 n=5+5)
```
This commit is contained in:
Bjørn Erik Pedersen 2017-08-14 09:24:38 +02:00
parent 199816fddd
commit 71ae9b4533
2 changed files with 12 additions and 5 deletions

View file

@ -18,6 +18,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"reflect" "reflect"
"unicode"
"github.com/bep/gitmap" "github.com/bep/gitmap"
@ -488,17 +489,23 @@ var (
// whether the contentis truncated or not. // whether the contentis truncated or not.
// Note: The content slice will be modified if needed. // Note: The content slice will be modified if needed.
func replaceDivider(content, from, to []byte) ([]byte, bool) { func replaceDivider(content, from, to []byte) ([]byte, bool) {
sections := bytes.Split(content, from) dividerIdx := bytes.Index(content, from)
if dividerIdx == -1 {
return content, false
}
afterSummary := content[dividerIdx+len(from):]
// If the raw content has nothing but whitespace after the summary // If the raw content has nothing but whitespace after the summary
// marker then the page shouldn't be marked as truncated. This check // marker then the page shouldn't be marked as truncated. This check
// is simplest against the raw content because different markup engines // is simplest against the raw content because different markup engines
// (rst and asciidoc in particular) add div and p elements after the // (rst and asciidoc in particular) add div and p elements after the
// summary marker. // summary marker.
truncated := (len(sections) == 2 && truncated := bytes.IndexFunc(afterSummary, func(r rune) bool { return !unicode.IsSpace(r) }) != -1
len(bytes.Trim(sections[1], " \n\r")) > 0)
return bytes.Join(sections, to), truncated content = append(content[:dividerIdx], append(to, afterSummary...)...)
return content, truncated
} }

View file

@ -1107,7 +1107,7 @@ func TestReplaceDivider(t *testing.T) {
expectedTruncated bool expectedTruncated bool
}{ }{
{"none", "a", "b", "none", false}, {"none", "a", "b", "none", false},
{"summary divider content", "divider", "HUGO", "summary HUGO content", true}, {"summary <!--more--> content", "<!--more-->", "HUGO", "summary HUGO content", true},
{"summary\n\ndivider", "divider", "HUGO", "summary\n\nHUGO", false}, {"summary\n\ndivider", "divider", "HUGO", "summary\n\nHUGO", false},
{"summary\n\ndivider\n\r", "divider", "HUGO", "summary\n\nHUGO\n\r", false}, {"summary\n\ndivider\n\r", "divider", "HUGO", "summary\n\nHUGO\n\r", false},
} }