rate: skip time.Now call in Sometimes.Do unless necessary
Don't update Sometimes.last if Interval is not configured.
goos: darwin
goarch: arm64
pkg: golang.org/x/time/rate
│ /tmp/before.txt │ /tmp/after.txt │
│ sec/op │ sec/op vs base │
Sometimes/no-interval-8 14.81n ± 0% 11.96n ± 0% -19.25% (p=0.000 n=10)
Sometimes/with-interval-8 27.30n ± 2% 27.57n ± 2% ~ (p=0.780 n=10)
geomean 20.10n 18.15n -9.70%
goos: linux
goarch: arm64
pkg: golang.org/x/time/rate
│ /tmp/before-rpi.txt │ /tmp/after-rpi.txt │
│ sec/op │ sec/op vs base │
Sometimes/no-interval-4 89.72n ± 4% 77.03n ± 2% -14.15% (p=0.000 n=10)
Sometimes/with-interval-4 147.1n ± 0% 147.8n ± 3% +0.48% (p=0.005 n=10)
geomean 114.9n 106.7n -7.12%
Change-Id: Ie4a064625432b9628a1cc5686eca9f0b3b90fb7b
Reviewed-on: https://go-review.googlesource.com/c/time/+/561956
Reviewed-by: Carlos Amedee <carlos@golang.org>
Auto-Submit: Sean Liao <sean@liao.dev>
Reviewed-by: Sean Liao <sean@liao.dev>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
diff --git a/rate/sometimes.go b/rate/sometimes.go
index 6ba99dd..9b83932 100644
--- a/rate/sometimes.go
+++ b/rate/sometimes.go
@@ -61,7 +61,9 @@
(s.Every > 0 && s.count%s.Every == 0) ||
(s.Interval > 0 && time.Since(s.last) >= s.Interval) {
f()
- s.last = time.Now()
+ if s.Interval > 0 {
+ s.last = time.Now()
+ }
}
s.count++
}
diff --git a/rate/sometimes_test.go b/rate/sometimes_test.go
index 6781770..b1c06fd 100644
--- a/rate/sometimes_test.go
+++ b/rate/sometimes_test.go
@@ -92,3 +92,18 @@
s.Do(func() {})
s.Do(func() {})
}
+
+func BenchmarkSometimes(b *testing.B) {
+ b.Run("no-interval", func(b *testing.B) {
+ s := rate.Sometimes{Every: 10}
+ for i := 0; i < b.N; i++ {
+ s.Do(func() {})
+ }
+ })
+ b.Run("with-interval", func(b *testing.B) {
+ s := rate.Sometimes{Interval: time.Second}
+ for i := 0; i < b.N; i++ {
+ s.Do(func() {})
+ }
+ })
+}