shithub: hugo

Download patch

ref: c8f8f48e9600f733422180d50a97bb2deea8ba75
parent: 19c52ab0b5a5a8f89d43dcc2e2a15e2f53170017
author: bep <[email protected]>
date: Wed Jan 21 10:28:05 EST 2015

Cache the page's rendering context flags

This map can potentially be used many times for a given page, and altough the cost of re-creating the map should be minimal, caching it is simple -- and could save some GC and CPU cycles.

--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -32,6 +32,7 @@
 	"path"
 	"path/filepath"
 	"strings"
+	"sync"
 	"time"
 )
 
@@ -50,15 +51,17 @@
 	Tmpl            tpl.Template
 	Markup          string
 
-	extension         string
-	contentType       string
-	renderable        bool
-	layout            string
-	linkTitle         string
-	frontmatter       []byte
-	rawContent        []byte
-	contentShortCodes map[string]string
-	plain             string // TODO should be []byte
+	extension                string
+	contentType              string
+	renderable               bool
+	layout                   string
+	linkTitle                string
+	frontmatter              []byte
+	rawContent               []byte
+	contentShortCodes        map[string]string
+	plain                    string // TODO should be []byte
+	renderingConfigFlags     map[string]bool
+	renderingConfigFlagsInit sync.Once
 	PageMeta
 	Source
 	Position
@@ -187,21 +190,24 @@
 }
 
 func (p *Page) getRenderingConfigFlags() map[string]bool {
-	flags := make(map[string]bool)
 
-	pageParam := p.GetParam("blackfriday")
-	siteParam := viper.GetStringMap("blackfriday")
+	p.renderingConfigFlagsInit.Do(func() {
+		p.renderingConfigFlags = make(map[string]bool)
 
-	flags = cast.ToStringMapBool(siteParam)
+		pageParam := p.GetParam("blackfriday")
+		siteParam := viper.GetStringMap("blackfriday")
 
-	if pageParam != nil {
-		pageFlags := cast.ToStringMapBool(pageParam)
-		for key, value := range pageFlags {
-			flags[key] = value
+		p.renderingConfigFlags = cast.ToStringMapBool(siteParam)
+
+		if pageParam != nil {
+			pageFlags := cast.ToStringMapBool(pageParam)
+			for key, value := range pageFlags {
+				p.renderingConfigFlags[key] = value
+			}
 		}
-	}
+	})
 
-	return flags
+	return p.renderingConfigFlags
 }
 
 func (p *Page) isRenderingFlagEnabled(flag string) bool {