mirror of
				https://github.com/gohugoio/hugo.git
				synced 2024-05-11 05:54:58 +00:00 
			
		
		
		
	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:
		@@ -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
 | 
			
		||||
 | 
			
		||||
	return bytes.Join(sections, to), truncated
 | 
			
		||||
	content = append(content[:dividerIdx], append(to, afterSummary...)...)
 | 
			
		||||
 | 
			
		||||
	return content, truncated
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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},
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user