Skip to content

Commit

Permalink
rate: avoid creating timer in WaitN if delay is zero
Browse files Browse the repository at this point in the history
name      old time/op    new time/op    delta
AllowN-4    76.7ns ± 6%    76.6ns ± 3%      ~     (p=0.897 n=10+10)
WaitNNoDelay-4     1.36µs ± 3%    0.10µs ± 1%   -92.64%  (p=0.000 n=10+9)

name      old alloc/op   new alloc/op   delta
AllowN-4     0.00B          0.00B           ~     (all equal)
WaitNNoDelay-4       208B ± 0%        0B       -100.00%  (p=0.000 n=10+10)

name      old allocs/op  new allocs/op  delta
AllowN-4      0.00           0.00           ~     (all equal)
WaitNNoDelay-4       3.00 ± 0%      0.00       -100.00%  (p=0.000 n=10+10)

Change-Id: I83addc3b3f7b053d6eee637fe188e21ca9b39f11
GitHub-Last-Rev: 2284b8e
GitHub-Pull-Request: #5
Reviewed-on: https://go-review.googlesource.com/106461
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
  • Loading branch information
bpot authored and bradfitz committed Apr 12, 2018
1 parent 26559e0 commit fbb02b2
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 2 deletions.
8 changes: 6 additions & 2 deletions rate/rate.go
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
10 changes: 10 additions & 0 deletions rate/rate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}

0 comments on commit fbb02b2

Please sign in to comment.