github.com/c9s/go@v0.0.0-20180120015821-984e81f64e0c/src/context/benchmark_test.go (about) 1 // Copyright 2014 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package context_test 6 7 import ( 8 . "context" 9 "fmt" 10 "runtime" 11 "sync" 12 "testing" 13 "time" 14 ) 15 16 func BenchmarkWithTimeout(b *testing.B) { 17 for concurrency := 40; concurrency <= 4e5; concurrency *= 100 { 18 name := fmt.Sprintf("concurrency=%d", concurrency) 19 b.Run(name, func(b *testing.B) { 20 benchmarkWithTimeout(b, concurrency) 21 }) 22 } 23 } 24 25 func benchmarkWithTimeout(b *testing.B, concurrentContexts int) { 26 gomaxprocs := runtime.GOMAXPROCS(0) 27 perPContexts := concurrentContexts / gomaxprocs 28 root := Background() 29 30 // Generate concurrent contexts. 31 var wg sync.WaitGroup 32 ccf := make([][]CancelFunc, gomaxprocs) 33 for i := range ccf { 34 wg.Add(1) 35 go func(i int) { 36 defer wg.Done() 37 cf := make([]CancelFunc, perPContexts) 38 for j := range cf { 39 _, cf[j] = WithTimeout(root, time.Hour) 40 } 41 ccf[i] = cf 42 }(i) 43 } 44 wg.Wait() 45 46 b.ResetTimer() 47 b.RunParallel(func(pb *testing.PB) { 48 wcf := make([]CancelFunc, 10) 49 for pb.Next() { 50 for i := range wcf { 51 _, wcf[i] = WithTimeout(root, time.Hour) 52 } 53 for _, f := range wcf { 54 f() 55 } 56 } 57 }) 58 b.StopTimer() 59 60 for _, cf := range ccf { 61 for _, f := range cf { 62 f() 63 } 64 } 65 } 66 67 func BenchmarkCancelTree(b *testing.B) { 68 depths := []int{1, 10, 100, 1000} 69 for _, d := range depths { 70 b.Run(fmt.Sprintf("depth=%d", d), func(b *testing.B) { 71 b.Run("Root=Background", func(b *testing.B) { 72 for i := 0; i < b.N; i++ { 73 buildContextTree(Background(), d) 74 } 75 }) 76 b.Run("Root=OpenCanceler", func(b *testing.B) { 77 for i := 0; i < b.N; i++ { 78 ctx, cancel := WithCancel(Background()) 79 buildContextTree(ctx, d) 80 cancel() 81 } 82 }) 83 b.Run("Root=ClosedCanceler", func(b *testing.B) { 84 for i := 0; i < b.N; i++ { 85 ctx, cancel := WithCancel(Background()) 86 cancel() 87 buildContextTree(ctx, d) 88 } 89 }) 90 }) 91 } 92 } 93 94 func buildContextTree(root Context, depth int) { 95 for d := 0; d < depth; d++ { 96 root, _ = WithCancel(root) 97 } 98 }