From 7af6a31b48c5cb4d8cc9ca346949d1143ece76ca Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Wed, 18 Mar 2020 18:46:04 +0000 Subject: [PATCH] runtime: add countAlloc benchmark This change adds a small microbenchmark for (*mspan).countAlloc, which we're about to replace. Admittedly this isn't a critical piece of code, but the benchmark was useful in understanding the performance change. Change-Id: Iea93c00f571ee95534a42f2ef2ab026b382242b3 Reviewed-on: https://go-review.googlesource.com/c/go/+/224438 Run-TryBot: Michael Knyszek Reviewed-by: Emmanuel Odeke Reviewed-by: Austin Clements Reviewed-by: Keith Randall TryBot-Result: Gobot Gobot --- src/runtime/export_test.go | 8 ++++++++ src/runtime/gc_test.go | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go index 6a8d00c60d..67379796c7 100644 --- a/src/runtime/export_test.go +++ b/src/runtime/export_test.go @@ -975,3 +975,11 @@ func MapHashCheck(m interface{}, k interface{}) (uintptr, uintptr) { y := typehash(kt, noescape(p), uintptr(mh.hash0)) return x, y } + +func MSpanCountAlloc(bits []byte) int { + s := mspan{ + nelems: uintptr(len(bits) * 8), + gcmarkBits: (*gcBits)(unsafe.Pointer(&bits[0])), + } + return s.countAlloc() +} diff --git a/src/runtime/gc_test.go b/src/runtime/gc_test.go index 8ffb4f4a0f..4c281ce52b 100644 --- a/src/runtime/gc_test.go +++ b/src/runtime/gc_test.go @@ -6,6 +6,7 @@ package runtime_test import ( "fmt" + "math/rand" "os" "reflect" "runtime" @@ -751,6 +752,24 @@ func BenchmarkScanStackNoLocals(b *testing.B) { close(teardown) } +func BenchmarkMSpanCountAlloc(b *testing.B) { + // n is the number of bytes to benchmark against. + // n must always be a multiple of 8, since gcBits is + // always rounded up 8 bytes. + for _, n := range []int{8, 16, 32, 64, 128} { + b.Run(fmt.Sprintf("bits=%d", n*8), func(b *testing.B) { + // Initialize a new byte slice with pseduo-random data. + bits := make([]byte, n) + rand.Read(bits) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + runtime.MSpanCountAlloc(bits) + } + }) + } +} + func countpwg(n *int, ready *sync.WaitGroup, teardown chan bool) { if *n == 0 { ready.Done()