URI: 
       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},
                }