| // 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) | |
| } | |
| } |