Skip to content

Commit a9280fa

Browse files
committed
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 <[email protected]>
1 parent 7f99845 commit a9280fa

File tree

2 files changed

+36
-5
lines changed

2 files changed

+36
-5
lines changed

src/net/tcpsock_test.go

+31
Original file line numberDiff line numberDiff line change
@@ -796,3 +796,34 @@ func TestCopyPipeIntoTCP(t *testing.T) {
796796
t.Fatal(err)
797797
}
798798
}
799+
800+
func BenchmarkSetReadDeadline(b *testing.B) {
801+
ln, err := newLocalListener("tcp")
802+
if err != nil {
803+
b.Fatal(err)
804+
}
805+
defer ln.Close()
806+
var serv Conn
807+
done := make(chan error)
808+
go func() {
809+
var err error
810+
serv, err = ln.Accept()
811+
done <- err
812+
}()
813+
c, err := Dial("tcp", ln.Addr().String())
814+
if err != nil {
815+
b.Fatal(err)
816+
}
817+
defer c.Close()
818+
if err := <-done; err != nil {
819+
b.Fatal(err)
820+
}
821+
defer serv.Close()
822+
c.SetWriteDeadline(time.Now().Add(2 * time.Hour))
823+
deadline := time.Now().Add(time.Hour)
824+
b.ResetTimer()
825+
for i := 0; i < b.N; i++ {
826+
c.SetReadDeadline(deadline)
827+
deadline = deadline.Add(1)
828+
}
829+
}

src/runtime/time.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -156,18 +156,18 @@ func (tb *timersBucket) addtimerLocked(t *timer) bool {
156156
}
157157
if t.i == 0 {
158158
// siftup moved to top: new earliest deadline.
159-
if tb.sleeping {
159+
if tb.sleeping && tb.sleepUntil > t.when {
160160
tb.sleeping = false
161161
notewakeup(&tb.waitnote)
162162
}
163163
if tb.rescheduling {
164164
tb.rescheduling = false
165165
goready(tb.gp, 0)
166166
}
167-
}
168-
if !tb.created {
169-
tb.created = true
170-
go timerproc(tb)
167+
if !tb.created {
168+
tb.created = true
169+
go timerproc(tb)
170+
}
171171
}
172172
return true
173173
}

0 commit comments

Comments
 (0)