hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit 71ae9b4533083be185c5314c9c5b273cc3bd07bd
parent 199816fddd6f16b4a3e9a737530c7738f0da1b24
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:
Mhugolib/page.go | 15+++++++++++----
Mhugolib/page_test.go | 2+-
2 files changed, 12 insertions(+), 5 deletions(-)
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
 
 }
 
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},
 	}