From f388b58540c2cc401dfa79e3d7b6a1846ac9a59f Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 24 Feb 2016 09:53:27 -0800 Subject: [PATCH] cmd/compile: reuseable cache of Prog structs Reuseable cache of Prog entries. Improves compiler speed by ~10%. Update #13646 Change-Id: I01bd8606540d989ea8b8ba5131d1275ba380d976 Reviewed-on: https://go-review.googlesource.com/19868 Reviewed-by: Brad Fitzpatrick Reviewed-by: Ian Lance Taylor --- src/cmd/internal/obj/link.go | 4 ++++ src/cmd/internal/obj/objfile.go | 1 + src/cmd/internal/obj/util.go | 15 ++++++++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 0fe3275a8e..c63c8e3c56 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -618,6 +618,10 @@ type Link struct { Data *LSym Etext *LSym Edata *LSym + + // Cache of Progs + allocIdx int + progs [10000]Prog } func (ctxt *Link) Diag(format string, args ...interface{}) { diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go index 3dc5152f54..2d5c82376b 100644 --- a/src/cmd/internal/obj/objfile.go +++ b/src/cmd/internal/obj/objfile.go @@ -318,6 +318,7 @@ func Flushplist(ctxt *Link) { ctxt.Plist = nil ctxt.Plast = nil ctxt.Curp = nil + ctxt.freeProgs() } func Writeobjfile(ctxt *Link, b *Biobuf) { diff --git a/src/cmd/internal/obj/util.go b/src/cmd/internal/obj/util.go index 5103299526..12b048d8e1 100644 --- a/src/cmd/internal/obj/util.go +++ b/src/cmd/internal/obj/util.go @@ -325,10 +325,23 @@ func (p *Prog) String() string { } func (ctxt *Link) NewProg() *Prog { - p := new(Prog) // should be the only call to this; all others should use ctxt.NewProg + var p *Prog + if i := ctxt.allocIdx; i < len(ctxt.progs) { + p = &ctxt.progs[i] + ctxt.allocIdx = i + 1 + } else { + p = new(Prog) // should be the only call to this; all others should use ctxt.NewProg + } p.Ctxt = ctxt return p } +func (ctxt *Link) freeProgs() { + s := ctxt.progs[:ctxt.allocIdx] + for i := range s { + s[i] = Prog{} + } + ctxt.allocIdx = 0 +} func (ctxt *Link) Line(n int) string { return ctxt.LineHist.LineString(n) -- 2.50.0