hugolib: Rewrite replaceDivider to reduce memory allocation - hugo - [fork] hugo port for 9front
HTML git clone git@git.drkhsh.at/hugo.git
DIR Log
DIR Files
DIR Refs
DIR Submodules
DIR README
DIR LICENSE
---
DIR commit 71ae9b4533083be185c5314c9c5b273cc3bd07bd
DIR parent 199816fddd6f16b4a3e9a737530c7738f0da1b24
HTML Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date: Mon, 14 Aug 2017 09:24:38 +0200
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)
```
Diffstat:
M hugolib/page.go | 15 +++++++++++----
M hugolib/page_test.go | 2 +-
2 files changed, 12 insertions(+), 5 deletions(-)
---
DIR diff --git a/hugolib/page.go b/hugolib/page.go
@@ -18,6 +18,7 @@ import (
"errors"
"fmt"
"reflect"
+ "unicode"
"github.com/bep/gitmap"
@@ -488,17 +489,23 @@ var (
// whether the contentis truncated or not.
// Note: The content slice will be modified if needed.
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
// marker then the page shouldn't be marked as truncated. This check
// is simplest against the raw content because different markup engines
// (rst and asciidoc in particular) add div and p elements after the
// summary marker.
- truncated := (len(sections) == 2 &&
- len(bytes.Trim(sections[1], " \n\r")) > 0)
+ truncated := bytes.IndexFunc(afterSummary, func(r rune) bool { return !unicode.IsSpace(r) }) != -1
+
+ content = append(content[:dividerIdx], append(to, afterSummary...)...)
- return bytes.Join(sections, to), truncated
+ return content, truncated
}
DIR diff --git a/hugolib/page_test.go b/hugolib/page_test.go
@@ -1107,7 +1107,7 @@ func TestReplaceDivider(t *testing.T) {
expectedTruncated bool
}{
{"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\n\r", "divider", "HUGO", "summary\n\nHUGO\n\r", false},
}