Skip to content

Commit

Permalink
testing: enable better loop time measurement for benchmarking.
Browse files Browse the repository at this point in the history
With b.Loop() in place, the time measurement of loop scaling could be improved to be tighter. By identifying the first call to b.Loop(), we can avoid measuring the expensive ramp-up time by reset the timer tightly before the loop starts. The remaining loop scaling logic of b.N style loop is largely reused.

For #61515.

Change-Id: Ia7b8f0a8838f57c00ac6c5ef779d86f8d713c9b6
Reviewed-on: https://go-review.googlesource.com/c/go/+/612835
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Junyang Shao <shaojunyang@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
  • Loading branch information
JunyangShao committed Sep 20, 2024
1 parent 6600a87 commit 402dc98
Showing 1 changed file with 6 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/testing/benchmark.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ type B struct {
// Extra metrics collected by ReportMetric.
extra map[string]float64
// Remaining iterations of Loop() to be executed in benchFunc.
// See issue #61515.
loopN int
}

Expand Down Expand Up @@ -358,6 +359,11 @@ func (b *B) ReportMetric(n float64, unit string) {
// After the benchmark finishes, b.N will contain the total number of calls to op, so the benchmark
// may use b.N to compute other average metrics.
func (b *B) Loop() bool {
if b.loopN == b.N {
// If it's the first call to b.Loop() in the benchmark function.
// Allows more precise measurement of benchmark loop cost counts.
b.ResetTimer()
}
b.loopN--
return b.loopN >= 0
}
Expand Down

0 comments on commit 402dc98

Please sign in to comment.