Skip to content

Commit

Permalink
Cache when not found in LookupLayout
Browse files Browse the repository at this point in the history
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)
```
  • Loading branch information
bep committed Jul 13, 2022
1 parent 223bf28 commit 9c24b86
Showing 1 changed file with 12 additions and 8 deletions.
20 changes: 12 additions & 8 deletions tpl/tplimpl/template.go
Expand Up @@ -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,
}
Expand Down Expand Up @@ -328,7 +328,7 @@ type templateHandler struct {

layoutHandler *output.LayoutHandler

layoutTemplateCache map[layoutCacheKey]tpl.Template
layoutTemplateCache map[layoutCacheKey]layoutCacheEntry
layoutTemplateCacheMu sync.RWMutex

*deps.Deps
Expand Down Expand Up @@ -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.
Expand All @@ -382,20 +388,18 @@ 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()

t.layoutTemplateCacheMu.Lock()
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
Expand Down

0 comments on commit 9c24b86

Please sign in to comment.