]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: reuse slice memory in deadcode pass
authorCherry Zhang <cherryyz@google.com>
Thu, 4 Jun 2020 16:01:53 +0000 (12:01 -0400)
committerCherry Zhang <cherryyz@google.com>
Thu, 4 Jun 2020 19:14:12 +0000 (19:14 +0000)
Reuse slice memory in the deadcode pass, reduce allocations.

Linking cmd/compile,

name           old alloc/op   new alloc/op   delta
Deadcode_GC      2.10MB ± 0%    1.41MB ± 0%  -32.61%  (p=0.008 n=5+5)

name           old allocs/op  new allocs/op  delta
Deadcode_GC       8.46k ± 0%     5.55k ± 0%  -34.45%  (p=0.008 n=5+5)

Change-Id: Ib9ba0928d68a65879007218697712b53acd3c5c5
Reviewed-on: https://go-review.googlesource.com/c/go/+/236566
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/link/internal/ld/deadcode.go

index 5aad7489f49897c498304b6003a750ed31e4f97b..d59b1f2c6511c29071712b4532f7720c3c8ca739 100644 (file)
@@ -24,6 +24,8 @@ type deadcodePass struct {
        ifaceMethod     map[methodsig]bool // methods declared in reached interfaces
        markableMethods []methodref        // methods of reached types
        reflectSeen     bool               // whether we have seen a reflect method call
+
+       methodsigstmp []methodsig // scratch buffer for decoding method signatures
 }
 
 func (d *deadcodePass) init() {
@@ -92,6 +94,7 @@ func (d *deadcodePass) init() {
 }
 
 func (d *deadcodePass) flood() {
+       var methods []methodref
        for !d.wq.empty() {
                symIdx := d.wq.pop()
 
@@ -112,7 +115,7 @@ func (d *deadcodePass) flood() {
                        }
                }
 
-               var methods []methodref
+               methods = methods[:0]
                for i := 0; i < relocs.Count(); i++ {
                        r := relocs.At2(i)
                        t := r.Type()
@@ -330,7 +333,10 @@ func (m methodref) isExported() bool {
 //
 // Conveniently this is the layout of both runtime.method and runtime.imethod.
 func (d *deadcodePass) decodeMethodSig(ldr *loader.Loader, arch *sys.Arch, symIdx loader.Sym, relocs *loader.Relocs, off, size, count int) []methodsig {
-       var methods = make([]methodsig, count)
+       if cap(d.methodsigstmp) < count {
+               d.methodsigstmp = append(d.methodsigstmp[:0], make([]methodsig, count)...)
+       }
+       var methods = d.methodsigstmp[:count]
        for i := 0; i < count; i++ {
                methods[i].name = decodetypeName(ldr, symIdx, relocs, off)
                methods[i].typ = decodeRelocSym(ldr, symIdx, relocs, int32(off+4))