]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Cache when not found in LookupLayout
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 13 Jul 2022 12:47:32 +0000 (14:47 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 13 Jul 2022 13:49:00 +0000 (15:49 +0200)
Very visible when using the pprof mutex profiler.

```bash
name         old time/op    new time/op    delta
Baseline-10    58.4ms ± 1%    51.6ms ± 0%  -11.56%  (p=0.029 n=4+4)

name         old alloc/op   new alloc/op   delta
Baseline-10    64.3MB ± 0%    64.2MB ± 0%     ~     (p=0.114 n=4+4)

name         old allocs/op  new allocs/op  delta
Baseline-10      649k ± 0%      649k ± 0%     ~     (p=0.229 n=4+4)
```

tpl/tplimpl/template.go

index c79605cbceb22197c49f76e21e22e746c53eeea9..81c898b2f7a408b9076b74fc9fc297f8159cd39c 100644 (file)
@@ -153,7 +153,7 @@ func newTemplateExec(d *deps.Deps) (*templateExec, error) {
                Deps:                d,
                layoutHandler:       output.NewLayoutHandler(),
                layoutsFs:           d.BaseFs.Layouts.Fs,
-               layoutTemplateCache: make(map[layoutCacheKey]tpl.Template),
+               layoutTemplateCache: make(map[layoutCacheKey]layoutCacheEntry),
 
                templateUsageTracker: templateUsageTracker,
        }
@@ -328,7 +328,7 @@ type templateHandler struct {
 
        layoutHandler *output.LayoutHandler
 
-       layoutTemplateCache   map[layoutCacheKey]tpl.Template
+       layoutTemplateCache   map[layoutCacheKey]layoutCacheEntry
        layoutTemplateCacheMu sync.RWMutex
 
        *deps.Deps
@@ -357,6 +357,12 @@ type templateHandler struct {
        templateUsageTrackerMu sync.Mutex
 }
 
+type layoutCacheEntry struct {
+       found bool
+       templ tpl.Template
+       err   error
+}
+
 // AddTemplate parses and adds a template to the collection.
 // Templates with name prefixed with "_text" will be handled as plain
 // text templates.
@@ -382,7 +388,7 @@ func (t *templateHandler) LookupLayout(d output.LayoutDescriptor, f output.Forma
        t.layoutTemplateCacheMu.RLock()
        if cacheVal, found := t.layoutTemplateCache[key]; found {
                t.layoutTemplateCacheMu.RUnlock()
-               return cacheVal, true, nil
+               return cacheVal.templ, cacheVal.found, cacheVal.err
        }
        t.layoutTemplateCacheMu.RUnlock()
 
@@ -390,12 +396,10 @@ func (t *templateHandler) LookupLayout(d output.LayoutDescriptor, f output.Forma
        defer t.layoutTemplateCacheMu.Unlock()
 
        templ, found, err := t.findLayout(d, f)
-       if err == nil && found {
-               t.layoutTemplateCache[key] = templ
-               return templ, true, nil
-       }
+       cacheVal := layoutCacheEntry{found: found, templ: templ, err: err}
+       t.layoutTemplateCache[key] = cacheVal
+       return cacheVal.templ, cacheVal.found, cacheVal.err
 
-       return nil, false, err
 }
 
 // This currently only applies to shortcodes and what we get here is the