mirror of
https://github.com/golang/go
synced 2024-11-18 11:44:45 -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:
parent
e7b1d0a9cf
commit
0b9c1ad20d
@ -96,3 +96,21 @@ func buildContextTree(root Context, depth int) {
|
|||||||
root, _ = WithCancel(root)
|
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 {
|
func (c *cancelCtx) Err() error {
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
defer c.mu.Unlock()
|
err := c.err
|
||||||
return c.err
|
c.mu.Unlock()
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cancelCtx) String() string {
|
func (c *cancelCtx) String() string {
|
||||||
|
Loading…
Reference in New Issue
Block a user