1
0
mirror of https://github.com/golang/go synced 2024-11-08 05:26:15 -07:00

runtime: avoid runtimeNano call on a common netpoll path

runtimeNano is slower than nanotime, so pass the duration
to runtime_pollSetDeadline as is. netpoll can add nanotime itself.
Arguably a bit simpler because, say, a negative duration
clearly represents already expired timer, no need to compare to
nanotime again.
This may also fix an obscure corner case when a deadline in past
which happens to be nanotime 0 is confused with no deadline at all,
which are radically different things.
Also don't compute any durations and times if Time is zero
(currently we first compute everything and then reset d back to 0,
which is wasteful).

name                  old time/op  new time/op  delta
TCP4OneShotTimeout-6  17.1µs ± 0%  17.0µs ± 0%     ~     (p=0.421 n=5+5)
SetReadDeadline-6      230ns ± 0%   205ns ± 1%  -10.63%  (p=0.008 n=5+5)

Change-Id: I2aad699270289a5b9ead68f5e44ec4ec6d96baa0
Reviewed-on: https://go-review.googlesource.com/c/146344
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Dmitry Vyukov <dvyukov@google.com>
This commit is contained in:
Dmitry Vyukov 2018-10-31 15:07:57 +01:00
parent 31e7842f3d
commit 21f7f01289
2 changed files with 13 additions and 11 deletions

View File

@ -136,15 +136,12 @@ func (fd *FD) SetWriteDeadline(t time.Time) error {
} }
func setDeadlineImpl(fd *FD, t time.Time, mode int) error { func setDeadlineImpl(fd *FD, t time.Time, mode int) error {
diff := int64(time.Until(t)) var d int64
d := runtimeNano() + diff if !t.IsZero() {
if d <= 0 && diff > 0 { d = int64(time.Until(t))
// If the user has a deadline in the future, but the delay calculation if d == 0 {
// overflows, then set the deadline to the maximum possible value. d = -1 // don't confuse deadline right now with no deadline
d = 1<<63 - 1
} }
if t.IsZero() {
d = 0
} }
if err := fd.incref(); err != nil { if err := fd.incref(); err != nil {
return err return err

View File

@ -201,8 +201,13 @@ func poll_runtime_pollSetDeadline(pd *pollDesc, d int64, mode int) {
} }
rd0, wd0 := pd.rd, pd.wd rd0, wd0 := pd.rd, pd.wd
combo0 := rd0 > 0 && rd0 == wd0 combo0 := rd0 > 0 && rd0 == wd0
if d != 0 && d <= nanotime() { if d > 0 {
d = -1 d += nanotime()
if d <= 0 {
// If the user has a deadline in the future, but the delay calculation
// overflows, then set the deadline to the maximum possible value.
d = 1<<63 - 1
}
} }
if mode == 'r' || mode == 'r'+'w' { if mode == 'r' || mode == 'r'+'w' {
pd.rd = d pd.rd = d