testing: allow manual timer control in testing.B.Loop

Fixes #72922

Change-Id: I56610d2d11d151a8f95b6434bbedbfcd5c11c317
Reviewed-on: https://go-review.googlesource.com/c/go/+/658975
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Commit-Queue: Junyang Shao <shaojunyang@google.com>
Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
Junyang Shao 2025-03-18 21:13:23 +00:00 committed by Go LUCI
parent ba50de8429
commit b613d21ffd
2 changed files with 9 additions and 7 deletions

View File

@ -368,8 +368,8 @@ func (b *B) ReportMetric(n float64, unit string) {
}
func (b *B) stopOrScaleBLoop() bool {
timeElapsed := highPrecisionTimeSince(b.start)
if timeElapsed >= b.benchTime.d {
t := b.Elapsed()
if t >= b.benchTime.d {
// Stop the timer so we don't count cleanup time
b.StopTimer()
return false
@ -377,7 +377,7 @@ func (b *B) stopOrScaleBLoop() bool {
// Loop scaling
goalns := b.benchTime.d.Nanoseconds()
prevIters := int64(b.N)
b.N = predictN(goalns, prevIters, timeElapsed.Nanoseconds(), prevIters)
b.N = predictN(goalns, prevIters, t.Nanoseconds(), prevIters)
b.loopN++
return true
}

View File

@ -7,7 +7,7 @@ package testing
func TestBenchmarkBLoop(t *T) {
var initialStart highPrecisionTime
var firstStart highPrecisionTime
var lastStart highPrecisionTime
var scaledStart highPrecisionTime
var runningEnd bool
runs := 0
iters := 0
@ -19,7 +19,9 @@ func TestBenchmarkBLoop(t *T) {
if iters == 0 {
firstStart = b.start
}
lastStart = b.start
if iters == 1 {
scaledStart = b.start
}
iters++
}
finalBN = b.N
@ -45,8 +47,8 @@ func TestBenchmarkBLoop(t *T) {
if firstStart == initialStart {
t.Errorf("b.Loop did not reset the timer")
}
if lastStart != firstStart {
t.Errorf("timer was reset during iteration")
if scaledStart != firstStart {
t.Errorf("b.Loop stops and restarts the timer during iteration")
}
// Verify that it stopped the timer after the last loop.
if runningEnd {