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() {})
+		}
+	})
+}