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:
parent
31e7842f3d
commit
21f7f01289
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user