Commit 0b9c1ad2 authored by Keegan Carruthers-Smith's avatar Keegan Carruthers-Smith Committed by Brad Fitzpatrick

context: avoid defer in the cancelCtx.Err method

name                  old time/op  new time/op  delta
CheckCanceled/Err-4   53.5ns ± 2%  20.8ns ± 0%  -61.05%  (p=0.008 n=5+5)
CheckCanceled/Done-4  44.4ns ± 1%  44.5ns ± 0%     ~     (p=0.889 n=5+5)

Change-Id: I2c68700a2b33f8feb3d307ce7c966590a3e960af
Reviewed-on: https://go-review.googlesource.com/107137Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent e7b1d0a9
......@@ -96,3 +96,21 @@ func buildContextTree(root Context, depth int) {
root, _ = WithCancel(root)
}
}
func BenchmarkCheckCanceled(b *testing.B) {
ctx, cancel := WithCancel(Background())
cancel()
b.Run("Err", func(b *testing.B) {
for i := 0; i < b.N; i++ {
ctx.Err()
}
})
b.Run("Done", func(b *testing.B) {
for i := 0; i < b.N; i++ {
select {
case <-ctx.Done():
default:
}
}
})
}
......@@ -334,8 +334,9 @@ func (c *cancelCtx) Done() <-chan struct{} {
func (c *cancelCtx) Err() error {
c.mu.Lock()
defer c.mu.Unlock()
return c.err
err := c.err
c.mu.Unlock()
return err
}
func (c *cancelCtx) String() string {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment