]> Cypherpunks repositories - gostls13.git/commitdiff
testing: enable better loop time measurement for benchmarking.
authorsunnymilk <shaojunyang@google.com>
Thu, 12 Sep 2024 19:23:37 +0000 (12:23 -0700)
committerJunyang Shao <shaojunyang@google.com>
Fri, 20 Sep 2024 19:10:01 +0000 (19:10 +0000)
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>

src/testing/benchmark.go

index 0271308346fa7cc6409beae9a49f8b4ad3925d0b..2c7083db0211b5457bfc6fcc556c0aa84a64cae8 100644 (file)
@@ -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
 }
 
@@ -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
 }