From 71ae9b4533083be185c5314c9c5b273cc3bd07bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 14 Aug 2017 09:24:38 +0200 Subject: hugolib: Rewrite replaceDivider to reduce memory allocation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ```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) ``` --- hugolib/page.go | 15 +++++++++++---- hugolib/page_test.go | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) (limited to 'hugolib') diff --git a/hugolib/page.go b/hugolib/page.go index b5d13d4db..5de976bd4 100644 --- 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 index cc2ab9662..7723c02c4 100644 --- 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 content", "", "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}, } -- cgit v1.2.3