From 0150f15a924a7b4ac0c794012f6b12c8aa406b54 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Tue, 19 Apr 2016 15:14:26 -0700 Subject: [PATCH] runtime: call mallocgc directly from makeslice and growslice MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The extra checks provided by newarray are redundant in these cases. This shrinks by one frame the call stack expected by the pprof test. name old time/op new time/op delta MakeSlice-8 34.3ns ± 2% 30.5ns ± 3% -11.03% (p=0.000 n=24+22) GrowSlicePtr-8 134ns ± 2% 129ns ± 3% -3.25% (p=0.000 n=25+24) Change-Id: Icd828655906b921c732701fd9d61da3fa217b0af Reviewed-on: https://go-review.googlesource.com/22276 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/runtime/pprof/mprof_test.go | 2 +- src/runtime/slice.go | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/runtime/pprof/mprof_test.go b/src/runtime/pprof/mprof_test.go index d15102c703..0fff9d46d9 100644 --- a/src/runtime/pprof/mprof_test.go +++ b/src/runtime/pprof/mprof_test.go @@ -82,7 +82,7 @@ func TestMemoryProfiler(t *testing.T) { # 0x[0-9,a-f]+ runtime/pprof_test\.TestMemoryProfiler\+0x[0-9,a-f]+ .*/runtime/pprof/mprof_test.go:61 `, (1<<10)*memoryProfilerRun, (1<<20)*memoryProfilerRun), - fmt.Sprintf(`0: 0 \[%v: %v\] @ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ + fmt.Sprintf(`0: 0 \[%v: %v\] @ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ 0x[0-9,a-f]+ # 0x[0-9,a-f]+ runtime/pprof_test\.allocateTransient2M\+0x[0-9,a-f]+ .*/runtime/pprof/mprof_test.go:27 # 0x[0-9,a-f]+ runtime/pprof_test\.TestMemoryProfiler\+0x[0-9,a-f]+ .*/runtime/pprof/mprof_test.go:62 `, memoryProfilerRun, (2<<20)*memoryProfilerRun), diff --git a/src/runtime/slice.go b/src/runtime/slice.go index f9414d7658..873e97ebff 100644 --- a/src/runtime/slice.go +++ b/src/runtime/slice.go @@ -55,7 +55,12 @@ func makeslice(t *slicetype, len64, cap64 int64) slice { panic(errorString("makeslice: cap out of range")) } - p := newarray(t.elem, uintptr(cap)) + et := t.elem + var flags uint32 + if et.kind&kindNoPointers != 0 { + flags = flagNoScan + } + p := mallocgc(et.size*uintptr(cap), et, flags) return slice{p, len, cap} } @@ -130,7 +135,7 @@ func growslice(t *slicetype, old slice, cap int) slice { memclr(add(p, lenmem), capmem-lenmem) } else { // Note: can't use rawmem (which avoids zeroing of memory), because then GC can scan uninitialized memory. - p = newarray(et, uintptr(newcap)) + p = mallocgc(capmem, et, 0) if !writeBarrier.enabled { memmove(p, old.array, lenmem) } else { -- 2.48.1