Skip to content

Commit

Permalink
cmd/compile: reuseable cache of Prog structs
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
randall77 committed Feb 24, 2016
1 parent 45c2e38 commit f388b58
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 1 deletion.
4 changes: 4 additions & 0 deletions src/cmd/internal/obj/link.go
Expand Up @@ -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{}) {
Expand Down
1 change: 1 addition & 0 deletions src/cmd/internal/obj/objfile.go
Expand Up @@ -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) {
Expand Down
15 changes: 14 additions & 1 deletion src/cmd/internal/obj/util.go
Expand Up @@ -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)
Expand Down

0 comments on commit f388b58

Please sign in to comment.