From: Josh Bleecher Snyder Date: Fri, 22 Mar 2019 21:51:33 +0000 (-0700) Subject: runtime: skip wb call in growslice when unnecessary X-Git-Tag: go1.13beta1~911 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=24f846e21240f6d6ab2ca23fe319230b7d7f8168;p=gostls13.git runtime: skip wb call in growslice when unnecessary Instrumenting make.bash reveals that almost half (49.54%) of the >16 million calls to growslice for pointer-containing slices are growing from an empty to a non-empty slice. In that case, there is no need to call the write barrier, which does some work before discovering that no pointers need shading. Change-Id: Ide741468d8dee7ad43ea0bfbea6ccdf680030a0f Reviewed-on: https://go-review.googlesource.com/c/go/+/168959 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- diff --git a/src/runtime/slice.go b/src/runtime/slice.go index 2309b1a615..dca41ff8cd 100644 --- a/src/runtime/slice.go +++ b/src/runtime/slice.go @@ -179,7 +179,7 @@ func growslice(et *_type, old slice, cap int) slice { } else { // Note: can't use rawmem (which avoids zeroing of memory), because then GC can scan uninitialized memory. p = mallocgc(capmem, et, true) - if writeBarrier.enabled { + if lenmem > 0 && writeBarrier.enabled { // Only shade the pointers in old.array since we know the destination slice p // only contains nil pointers because it has been cleared during alloc. bulkBarrierPreWriteSrcOnly(uintptr(p), uintptr(old.array), lenmem)