Commit a1261b8b authored by Russ Cox's avatar Russ Cox

runtime: do not allocate on every time.Sleep

It's common for some goroutines to loop calling time.Sleep.
Allocate once per goroutine, not every time.
This comes up in runtime/pprof's background reader.

Change-Id: I89d17dc7379dca266d2c9cd3aefc2382f5bdbade
Reviewed-on: https://go-review.googlesource.com/37162Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
Reviewed-by: default avatarAustin Clements <austin@google.com>
parent a1ea9121
...@@ -2330,6 +2330,7 @@ func goexit0(gp *g) { ...@@ -2330,6 +2330,7 @@ func goexit0(gp *g) {
gp.waitreason = "" gp.waitreason = ""
gp.param = nil gp.param = nil
gp.labels = nil gp.labels = nil
gp.timer = nil
// Note that gp's stack scan is now "valid" because it has no // Note that gp's stack scan is now "valid" because it has no
// stack. // stack.
......
...@@ -376,6 +376,7 @@ type g struct { ...@@ -376,6 +376,7 @@ type g struct {
waiting *sudog // sudog structures this g is waiting on (that have a valid elem ptr); in lock order waiting *sudog // sudog structures this g is waiting on (that have a valid elem ptr); in lock order
cgoCtxt []uintptr // cgo traceback context cgoCtxt []uintptr // cgo traceback context
labels unsafe.Pointer // profiler labels labels unsafe.Pointer // profiler labels
timer *timer // cached timer for time.Sleep
// Per-G GC state // Per-G GC state
......
...@@ -50,7 +50,12 @@ func timeSleep(ns int64) { ...@@ -50,7 +50,12 @@ func timeSleep(ns int64) {
return return
} }
t := new(timer) t := getg().timer
if t == nil {
t = new(timer)
getg().timer = t
}
*t = timer{}
t.when = nanotime() + ns t.when = nanotime() + ns
t.f = goroutineReady t.f = goroutineReady
t.arg = getg() t.arg = getg()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment