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 <bradfitz@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Data *LSym
Etext *LSym
Edata *LSym
+
+ // Cache of Progs
+ allocIdx int
+ progs [10000]Prog
}
func (ctxt *Link) Diag(format string, args ...interface{}) {
ctxt.Plist = nil
ctxt.Plast = nil
ctxt.Curp = nil
+ ctxt.freeProgs()
}
func Writeobjfile(ctxt *Link, b *Biobuf) {
}
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)