| // Copyright 2014 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package context_test |
| |
| import ( |
| . "context" |
| "fmt" |
| "testing" |
| ) |
| |
| func BenchmarkContextCancelTree(b *testing.B) { |
| depths := []int{1, 10, 100, 1000} |
| for _, d := range depths { |
| b.Run(fmt.Sprintf("depth=%d", d), func(b *testing.B) { |
| b.Run("Root=Background", func(b *testing.B) { |
| for i := 0; i < b.N; i++ { |
| buildContextTree(Background(), d) |
| } |
| }) |
| b.Run("Root=OpenCanceler", func(b *testing.B) { |
| for i := 0; i < b.N; i++ { |
| ctx, cancel := WithCancel(Background()) |
| buildContextTree(ctx, d) |
| cancel() |
| } |
| }) |
| b.Run("Root=ClosedCanceler", func(b *testing.B) { |
| for i := 0; i < b.N; i++ { |
| ctx, cancel := WithCancel(Background()) |
| cancel() |
| buildContextTree(ctx, d) |
| } |
| }) |
| }) |
| } |
| } |
| |
| func buildContextTree(root Context, depth int) { |
| for d := 0; d < depth; d++ { |
| root, _ = WithCancel(root) |
| } |
| } |