diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-10-31 11:31:31 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-11-02 12:48:03 +0000 |
| commit | a9280fa2de5b9dc13f75dd3aebdf4a218fca451e (patch) | |
| tree | 8d3176d68134c618a96abfa3a0b53233b22590f5 /src/runtime/time.go | |
| parent | 7f9984535995fc90556bd18d73b43b4bad744c99 (diff) | |
| download | go-a9280fa2de5b9dc13f75dd3aebdf4a218fca451e.tar.xz | |
runtime: don't wake timeproc needlessly
It's not always necessary to wake timerproc even if we add
a new timer to the top of the heap. Since we don't wake and
reset timerproc when we remove timers, it still can be sleeping
with shorter timeout. It such case it's more profitable to let it
sleep and then update timeout when it wakes on its own rather than
proactively wake it, let it update timeout and go to sleep again.
name old time/op new time/op delta
TCP4OneShotTimeout-6 18.6µs ± 1% 17.2µs ± 0% -7.66% (p=0.008 n=5+5)
SetReadDeadline-6 562ns ± 5% 319ns ± 1% -43.27% (p=0.008 n=5+5)
Update #25729
Change-Id: Iec8eacb8563dbc574a82358b3bac7ac479c16826
Reviewed-on: https://go-review.googlesource.com/c/146337
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/runtime/time.go')
| -rw-r--r-- | src/runtime/time.go | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/runtime/time.go b/src/runtime/time.go index 790819f259..5e1a925dee 100644 --- a/src/runtime/time.go +++ b/src/runtime/time.go @@ -156,7 +156,7 @@ func (tb *timersBucket) addtimerLocked(t *timer) bool { } if t.i == 0 { // siftup moved to top: new earliest deadline. - if tb.sleeping { + if tb.sleeping && tb.sleepUntil > t.when { tb.sleeping = false notewakeup(&tb.waitnote) } @@ -164,10 +164,10 @@ func (tb *timersBucket) addtimerLocked(t *timer) bool { tb.rescheduling = false goready(tb.gp, 0) } - } - if !tb.created { - tb.created = true - go timerproc(tb) + if !tb.created { + tb.created = true + go timerproc(tb) + } } return true } |
