From 5bdf46956d33e4b048ab7b6d9c9ab5477729df1a Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Thu, 23 Nov 2017 17:03:33 +0000 Subject: [PATCH] optimisation: make Memoise(Memoise(...)) only memoise once All outputs of Memoise() are fixpoints to the function, i.e. feeding them as inputs to the function just returns them. We don't hit this optimisation in current code but have had instances in the past. --- render/memoise.go | 3 +++ render/memoise_test.go | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/render/memoise.go b/render/memoise.go index 6f96e1c39..93859327d 100644 --- a/render/memoise.go +++ b/render/memoise.go @@ -27,6 +27,9 @@ type memoise struct { // Memoise wraps the renderer in a loving embrace of caching. func Memoise(r Renderer) Renderer { + if _, ok := r.(*memoise); ok { + return r // fixpoint + } return &memoise{ Renderer: r, id: fmt.Sprintf("%x", rand.Int63()), diff --git a/render/memoise_test.go b/render/memoise_test.go index 9d7954ae9..79c779a36 100644 --- a/render/memoise_test.go +++ b/render/memoise_test.go @@ -20,6 +20,11 @@ func TestMemoise(t *testing.T) { return render.Nodes{Nodes: report.Nodes{rpt.ID: report.MakeNode(rpt.ID)}} }) m := render.Memoise(r) + + if render.Memoise(m) != m { + t.Errorf("Memoised renderers should be fixpoints.") + } + rpt1 := report.MakeReport() result1 := m.Render(rpt1)