aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josharian@gmail.com>2018-04-06 17:44:26 -0700
committerJosh Bleecher Snyder <josharian@gmail.com>2018-05-01 13:33:01 +0000
commitdda4591c8cc0b57e76339f1f18a6f5670cee2aaa (patch)
tree83366e7467ffafaf9a33f233f7f280b48c37d707 /src
parent9ecf899b295c3661bb6ad0e7345fb479986d13f0 (diff)
downloadgo-dda4591c8cc0b57e76339f1f18a6f5670cee2aaa.tar.xz
runtime: add BenchmarkScanStack
There are many possible stack scanning benchmarks, but this one is at least a start. cpuprofiling shows about 75% of CPU in func scanstack. Change-Id: I906b0493966f2165c1920636c4e057d16d6447e0 Reviewed-on: https://go-review.googlesource.com/105535 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/runtime/gc_test.go32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/runtime/gc_test.go b/src/runtime/gc_test.go
index d683d89fe4..4895a0e2ac 100644
--- a/src/runtime/gc_test.go
+++ b/src/runtime/gc_test.go
@@ -10,6 +10,7 @@ import (
"reflect"
"runtime"
"runtime/debug"
+ "sync"
"sync/atomic"
"testing"
"time"
@@ -643,3 +644,34 @@ func BenchmarkBulkWriteBarrier(b *testing.B) {
runtime.KeepAlive(ptrs)
}
+
+func BenchmarkScanStackNoLocals(b *testing.B) {
+ var ready sync.WaitGroup
+ teardown := make(chan bool)
+ for j := 0; j < 10; j++ {
+ ready.Add(1)
+ go func() {
+ x := 100000
+ countpwg(&x, &ready, teardown)
+ }()
+ }
+ ready.Wait()
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ b.StartTimer()
+ runtime.GC()
+ runtime.GC()
+ b.StopTimer()
+ }
+ close(teardown)
+}
+
+func countpwg(n *int, ready *sync.WaitGroup, teardown chan bool) {
+ if *n == 0 {
+ ready.Done()
+ <-teardown
+ return
+ }
+ *n--
+ countpwg(n, ready, teardown)
+}