diff --git a/rate/rate.go b/rate/rate.go index eabcd11..7228d97 100644 --- a/rate/rate.go +++ b/rate/rate.go @@ -253,8 +253,12 @@ func (lim *Limiter) waitN(ctx contextContext, n int) (err error) { if !r.ok { return fmt.Errorf("rate: Wait(n=%d) would exceed context deadline", n) } - // Wait - t := time.NewTimer(r.DelayFrom(now)) + // Wait if necessary + delay := r.DelayFrom(now) + if delay == 0 { + return nil + } + t := time.NewTimer(delay) defer t.Stop() select { case <-t.C: diff --git a/rate/rate_test.go b/rate/rate_test.go index e8add69..ec8c66d 100644 --- a/rate/rate_test.go +++ b/rate/rate_test.go @@ -447,3 +447,13 @@ func BenchmarkAllowN(b *testing.B) { } }) } + +func BenchmarkWaitNNoDelay(b *testing.B) { + lim := NewLimiter(Limit(b.N), b.N) + ctx := context.Background() + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + lim.WaitN(ctx, 1) + } +}