From 78b96db04ec9937de53c6bba0db3aeb9fff470db Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 4 Jun 2020 12:01:53 -0400 Subject: [PATCH] [dev.link] cmd/link: reuse slice memory in deadcode pass MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/deadcode.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index 5aad7489f4..d59b1f2c65 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -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)) -- 2.50.0