Skip to content

Commit fc3f8d4

Browse files
committed
time: speed up Since and Until
time.now is somewhat expensive (much more expensive than nanotime), in the common case when Time has monotonic time we don't actually need to call time.now in Since/Until as we can do calculation based purely on monotonic times. name old time/op new time/op delta TCP4OneShotTimeout-6 17.0µs ± 0% 17.1µs ± 1% ~ (p=0.151 n=5+5) SetReadDeadline-6 261ns ± 0% 234ns ± 1% -10.35% (p=0.008 n=5+5) Benchmark that only calls Until: benchmark old ns/op new ns/op delta BenchmarkUntil 54.0 29.5 -45.37% Update #25729 Change-Id: I5ac5af3eb1fe9f583cf79299f10b84501b1a0d7d Reviewed-on: https://go-review.googlesource.com/c/146341 Run-TryBot: Dmitry Vyukov <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent a1ee0a2 commit fc3f8d4

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

src/time/time.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -908,13 +908,27 @@ func (t Time) Sub(u Time) Duration {
908908
// Since returns the time elapsed since t.
909909
// It is shorthand for time.Now().Sub(t).
910910
func Since(t Time) Duration {
911-
return Now().Sub(t)
911+
var now Time
912+
if t.wall&hasMonotonic != 0 {
913+
// Common case optimization: if t has monotomic time, then Sub will use only it.
914+
now = Time{hasMonotonic, runtimeNano() - startNano, nil}
915+
} else {
916+
now = Now()
917+
}
918+
return now.Sub(t)
912919
}
913920

914921
// Until returns the duration until t.
915922
// It is shorthand for t.Sub(time.Now()).
916923
func Until(t Time) Duration {
917-
return t.Sub(Now())
924+
var now Time
925+
if t.wall&hasMonotonic != 0 {
926+
// Common case optimization: if t has monotomic time, then Sub will use only it.
927+
now = Time{hasMonotonic, runtimeNano() - startNano, nil}
928+
} else {
929+
now = Now()
930+
}
931+
return t.Sub(now)
918932
}
919933

920934
// AddDate returns the time corresponding to adding the

0 commit comments

Comments
 (0)