aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/time.go
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2017-02-17 10:17:42 -0500
committerRuss Cox <rsc@golang.org>2017-02-24 15:34:01 +0000
commita1261b8b0a38814df453defb2fc2cae3ba0c956a (patch)
treea40724e7525ff029b75ed62e834da23e551f85e2 /src/runtime/time.go
parenta1ea91219faa7c35098ffbb958582897fcd33123 (diff)
downloadgo-a1261b8b0a38814df453defb2fc2cae3ba0c956a.tar.xz
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/37162 Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src/runtime/time.go')
-rw-r--r--src/runtime/time.go7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/runtime/time.go b/src/runtime/time.go
index c296338e9b..88ab8b9c02 100644
--- a/src/runtime/time.go
+++ b/src/runtime/time.go
@@ -50,7 +50,12 @@ func timeSleep(ns int64) {
return
}
- t := new(timer)
+ t := getg().timer
+ if t == nil {
+ t = new(timer)
+ getg().timer = t
+ }
+ *t = timer{}
t.when = nanotime() + ns
t.f = goroutineReady
t.arg = getg()