From: Keith Randall Date: Wed, 24 Feb 2016 17:53:27 +0000 (-0800) Subject: cmd/compile: reuseable cache of Prog structs X-Git-Tag: go1.7beta1~1739 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f388b58540c2cc401dfa79e3d7b6a1846ac9a59f;p=gostls13.git 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 --- 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)