mirror of
https://github.com/golang/go
synced 2024-11-13 18:40:22 -07:00
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 <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
45c2e38b37
commit
f388b58540
@ -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{}) {
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user