]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: skip wb call in growslice when unnecessary
authorJosh Bleecher Snyder <josharian@gmail.com>
Fri, 22 Mar 2019 21:51:33 +0000 (14:51 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Mon, 25 Mar 2019 17:11:46 +0000 (17:11 +0000)
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 <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/runtime/slice.go

index 2309b1a615ee5b0a5d5ad932e41952dc88892bcb..dca41ff8cd4364f1dd893b97f283f5ce64bf13fd 100644 (file)
@@ -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)