aboutsummaryrefslogtreecommitdiff
path: root/src/time
diff options
context:
space:
mode:
authorDamien Neil <dneil@google.com>2025-03-12 16:00:26 -0700
committerGopher Robot <gobot@golang.org>2025-03-18 10:50:51 -0700
commit5916bc5b5796e8fd15f3b4e95c945f5f4933e1d5 (patch)
tree0de2e9af22d47a73b1099d484a17ffe47a8d88c8 /src/time
parent069471838998c304ac751b031a19283a9ad30bdb (diff)
downloadgo-5916bc5b5796e8fd15f3b4e95c945f5f4933e1d5.tar.xz
runtime, time: don't use monotonic clock inside synctest bubbles
Don't include a monotonic time in time.Times created inside a bubble, to avoid the confusion of different Times using different monotonic clock epochs. For #67434 goos: darwin goarch: arm64 pkg: time cpu: Apple M1 Pro │ /tmp/bench.0 │ /tmp/bench.1 │ │ sec/op │ sec/op vs base │ Since-10 18.42n ± 2% 18.68n ± 1% ~ (p=0.101 n=10) Until-10 18.28n ± 2% 18.46n ± 2% +0.98% (p=0.009 n=10) geomean 18.35n 18.57n +1.20% Change-Id: Iaf1b80d0a4df52139c5b80d4bde4410ef8a49f2f Reviewed-on: https://go-review.googlesource.com/c/go/+/657415 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Damien Neil <dneil@google.com> Reviewed-by: Michael Pratt <mpratt@google.com>
Diffstat (limited to 'src/time')
-rw-r--r--src/time/time.go7
-rw-r--r--src/time/time_test.go14
2 files changed, 19 insertions, 2 deletions
diff --git a/src/time/time.go b/src/time/time.go
index 14e79672ca..bcaeee407e 100644
--- a/src/time/time.go
+++ b/src/time/time.go
@@ -1221,7 +1221,7 @@ func subMono(t, u int64) Duration {
// Since returns the time elapsed since t.
// It is shorthand for time.Now().Sub(t).
func Since(t Time) Duration {
- if t.wall&hasMonotonic != 0 {
+ if t.wall&hasMonotonic != 0 && !runtimeIsBubbled() {
// Common case optimization: if t has monotonic time, then Sub will use only it.
return subMono(runtimeNano()-startNano, t.ext)
}
@@ -1231,7 +1231,7 @@ func Since(t Time) Duration {
// Until returns the duration until t.
// It is shorthand for t.Sub(time.Now()).
func Until(t Time) Duration {
- if t.wall&hasMonotonic != 0 {
+ if t.wall&hasMonotonic != 0 && !runtimeIsBubbled() {
// Common case optimization: if t has monotonic time, then Sub will use only it.
return subMono(t.ext, runtimeNano()-startNano)
}
@@ -1325,6 +1325,9 @@ func runtimeNow() (sec int64, nsec int32, mono int64)
//go:linkname runtimeNano
func runtimeNano() int64
+//go:linkname runtimeIsBubbled
+func runtimeIsBubbled() bool
+
// Monotonic times are reported as offsets from startNano.
// We initialize startNano to runtimeNano() - 1 so that on systems where
// monotonic time resolution is fairly low (e.g. Windows 2008
diff --git a/src/time/time_test.go b/src/time/time_test.go
index ff253be46b..dcb477b658 100644
--- a/src/time/time_test.go
+++ b/src/time/time_test.go
@@ -1497,6 +1497,20 @@ func BenchmarkNowUnixMicro(b *testing.B) {
}
}
+func BenchmarkSince(b *testing.B) {
+ start := Now()
+ for b.Loop() {
+ u = int64(Since(start))
+ }
+}
+
+func BenchmarkUntil(b *testing.B) {
+ end := Now().Add(1 * Hour)
+ for b.Loop() {
+ u = int64(Until(end))
+ }
+}
+
func BenchmarkFormat(b *testing.B) {
t := Unix(1265346057, 0)
for i := 0; i < b.N; i++ {