1
0
mirror of https://github.com/golang/go synced 2024-11-18 09:04:49 -07:00

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/107137
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Keegan Carruthers-Smith 2018-04-15 22:22:13 +01:00 committed by Brad Fitzpatrick
parent e7b1d0a9cf
commit 0b9c1ad20d
2 changed files with 21 additions and 2 deletions

View File

@ -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:
}
}
})
}

View File

@ -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 {