aboutsummaryrefslogtreecommitdiff
path: root/src/time
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2023-08-10 11:56:53 -0400
committerRuss Cox <rsc@golang.org>2023-08-11 15:26:40 +0000
commit446783960277251fcb837f3672f377469d204918 (patch)
treed1aee4b5dc659b0265565acfd974e7d08699413c /src/time
parent8870b8d2817dc90da96ce6cfb767034d12965252 (diff)
downloadgo-446783960277251fcb837f3672f377469d204918.tar.gz
go-446783960277251fcb837f3672f377469d204918.zip
time: make time.Since a few nanoseconds faster
time.Since(base) is an idiom that can be used to read the system monotonic time as efficiently as possible, when that matters. The current code structure adds a few nanoseconds on top of the 15-20ns the time read already takes. Remove those few. After this CL, there is no reason at all for anyone to //go:linkname runtime.nanotime1 instead. Came up while investigating #61765. Change-Id: Ic9e688af039babfc2a5a8e67dcbb02847a5eb686 Reviewed-on: https://go-review.googlesource.com/c/go/+/518336 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Damien Neil <dneil@google.com> Run-TryBot: Russ Cox <rsc@golang.org> Reviewed-by: Joseph Tsai <joetsai@digital-static.net>
Diffstat (limited to 'src/time')
-rw-r--r--src/time/time.go29
1 files changed, 14 insertions, 15 deletions
diff --git a/src/time/time.go b/src/time/time.go
index 00c6d6423f..8570635e2a 100644
--- a/src/time/time.go
+++ b/src/time/time.go
@@ -891,16 +891,7 @@ func (t Time) Add(d Duration) Time {
// To compute t-d for a duration d, use t.Add(-d).
func (t Time) Sub(u Time) Duration {
if t.wall&u.wall&hasMonotonic != 0 {
- te := t.ext
- ue := u.ext
- d := Duration(te - ue)
- if d < 0 && te > ue {
- return maxDuration // t - u is positive out of range
- }
- if d > 0 && te < ue {
- return minDuration // t - u is negative out of range
- }
- return d
+ return subMono(t.ext, u.ext)
}
d := Duration(t.sec()-u.sec())*Second + Duration(t.nsec()-u.nsec())
// Check for overflow or underflow.
@@ -914,17 +905,25 @@ func (t Time) Sub(u Time) Duration {
}
}
+func subMono(t, u int64) Duration {
+ d := Duration(t - u)
+ if d < 0 && t > u {
+ return maxDuration // t - u is positive out of range
+ }
+ if d > 0 && t < u {
+ return minDuration // t - u is negative out of range
+ }
+ return d
+}
+
// Since returns the time elapsed since t.
// It is shorthand for time.Now().Sub(t).
func Since(t Time) Duration {
- var now Time
if t.wall&hasMonotonic != 0 {
// Common case optimization: if t has monotonic time, then Sub will use only it.
- now = Time{hasMonotonic, runtimeNano() - startNano, nil}
- } else {
- now = Now()
+ return subMono(runtimeNano()-startNano, t.ext)
}
- return now.Sub(t)
+ return Now().Sub(t)
}
// Until returns the duration until t.