2024-12-12 21:17:04 -05:00
|
|
|
// Copyright 2024 The Go Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package testing
|
|
|
|
|
|
|
|
func TestBenchmarkBLoop(t *T) {
|
|
|
|
var initialStart highPrecisionTime
|
|
|
|
var firstStart highPrecisionTime
|
2025-03-18 21:13:23 +00:00
|
|
|
var scaledStart highPrecisionTime
|
2024-12-12 21:18:44 -05:00
|
|
|
var runningEnd bool
|
2024-12-12 21:17:04 -05:00
|
|
|
runs := 0
|
|
|
|
iters := 0
|
|
|
|
finalBN := 0
|
|
|
|
bRet := Benchmark(func(b *B) {
|
|
|
|
initialStart = b.start
|
|
|
|
runs++
|
|
|
|
for b.Loop() {
|
|
|
|
if iters == 0 {
|
|
|
|
firstStart = b.start
|
|
|
|
}
|
2025-03-18 21:13:23 +00:00
|
|
|
if iters == 1 {
|
|
|
|
scaledStart = b.start
|
|
|
|
}
|
2024-12-12 21:17:04 -05:00
|
|
|
iters++
|
|
|
|
}
|
|
|
|
finalBN = b.N
|
2024-12-12 21:18:44 -05:00
|
|
|
runningEnd = b.timerOn
|
2024-12-12 21:17:04 -05:00
|
|
|
})
|
|
|
|
// Verify that a b.Loop benchmark is invoked just once.
|
|
|
|
if runs != 1 {
|
|
|
|
t.Errorf("want runs == 1, got %d", runs)
|
|
|
|
}
|
|
|
|
// Verify that at least one iteration ran.
|
|
|
|
if iters == 0 {
|
|
|
|
t.Fatalf("no iterations ran")
|
|
|
|
}
|
|
|
|
// Verify that b.N, bRet.N, and the b.Loop() iteration count match.
|
|
|
|
if finalBN != iters || bRet.N != iters {
|
|
|
|
t.Errorf("benchmark iterations mismatch: %d loop iterations, final b.N=%d, bRet.N=%d", iters, finalBN, bRet.N)
|
|
|
|
}
|
|
|
|
// Make sure the benchmark ran for an appropriate amount of time.
|
|
|
|
if bRet.T < benchTime.d {
|
|
|
|
t.Fatalf("benchmark ran for %s, want >= %s", bRet.T, benchTime.d)
|
|
|
|
}
|
|
|
|
// Verify that the timer is reset on the first loop, and then left alone.
|
|
|
|
if firstStart == initialStart {
|
|
|
|
t.Errorf("b.Loop did not reset the timer")
|
|
|
|
}
|
2025-03-18 21:13:23 +00:00
|
|
|
if scaledStart != firstStart {
|
|
|
|
t.Errorf("b.Loop stops and restarts the timer during iteration")
|
2024-12-12 21:17:04 -05:00
|
|
|
}
|
2024-12-12 21:18:44 -05:00
|
|
|
// Verify that it stopped the timer after the last loop.
|
|
|
|
if runningEnd {
|
|
|
|
t.Errorf("timer was still running after last iteration")
|
|
|
|
}
|
2024-12-12 21:17:04 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// See also TestBenchmarkBLoop* in other files.
|