From d91e9705f87da8b939a6e074ebaa0de6b0340541 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Fri, 6 Apr 2018 21:45:55 -0700 Subject: [PATCH] runtime: avoid unnecessary scanblock calls MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This is the scanstack analog of CL 104737, which made a similar change for copystack. name old time/op new time/op delta ScanStack-8 41.1ms ± 6% 38.9ms ± 5% -5.52% (p=0.000 n=50+48) Change-Id: I7427151dea2895ed3934f8a0f61d96b568019217 Reviewed-on: https://go-review.googlesource.com/105536 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/runtime/mgcmark.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index 7be2820909..ce3f63883e 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -839,9 +839,11 @@ func scanframeworker(frame *stkframe, cache *pcvalueCache, gcw *gcWork) { print("runtime: pcdata is ", pcdata, " and ", stkmap.n, " locals stack map entries for ", funcname(f), " (targetpc=", targetpc, ")\n") throw("scanframe: bad symbol table") } - bv := stackmapdata(stkmap, pcdata) - size = uintptr(bv.n) * sys.PtrSize - scanblock(frame.varp-size, size, bv.bytedata, gcw) + if stkmap.nbit > 0 { + bv := stackmapdata(stkmap, pcdata) + size = uintptr(bv.n) * sys.PtrSize + scanblock(frame.varp-size, size, bv.bytedata, gcw) + } } // Scan arguments. @@ -862,7 +864,9 @@ func scanframeworker(frame *stkframe, cache *pcvalueCache, gcw *gcWork) { } bv = stackmapdata(stkmap, pcdata) } - scanblock(frame.argp, uintptr(bv.n)*sys.PtrSize, bv.bytedata, gcw) + if bv.n > 0 { + scanblock(frame.argp, uintptr(bv.n)*sys.PtrSize, bv.bytedata, gcw) + } } } -- 2.51.0