aboutsummaryrefslogtreecommitdiff
path: root/src/testing/benchmark.go
diff options
context:
space:
mode:
authorJunyang Shao <shaojunyang@google.com>2024-11-21 07:36:25 +0000
committerGo LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>2024-11-21 22:09:32 +0000
commit154fb4e1d45e503658542dee5296243a6146e7ca (patch)
tree213336d17b34a5ffacf334d4afc34e6934e1c414 /src/testing/benchmark.go
parent0c6dbd99c570874ef5ec353298708677c1675dd0 (diff)
downloadgo-154fb4e1d45e503658542dee5296243a6146e7ca.tar.xz
testing: Update testing.B.Loop to save benchmark results.
This is fixing some the missing logic of CL 627755. Change-Id: I35acffef7299331fce21da4a80a26185b2e909f4 Reviewed-on: https://go-review.googlesource.com/c/go/+/630455 Commit-Queue: Junyang Shao <shaojunyang@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/testing/benchmark.go')
-rw-r--r--src/testing/benchmark.go51
1 files changed, 27 insertions, 24 deletions
diff --git a/src/testing/benchmark.go b/src/testing/benchmark.go
index db0aec5100..67a5abccb4 100644
--- a/src/testing/benchmark.go
+++ b/src/testing/benchmark.go
@@ -230,13 +230,12 @@ func (b *B) run1() bool {
b.mu.RLock()
finished := b.finished
b.mu.RUnlock()
- // b.Loop() does its own ramp-up so we just need to run it once.
- if b.hasSub.Load() || finished || b.loopN != 0 {
+ if b.hasSub.Load() || finished {
tag := "BENCH"
if b.skipped {
tag = "SKIP"
}
- if b.chatty != nil && (len(b.output) > 0 || finished || b.loopN != 0) {
+ if b.chatty != nil && (len(b.output) > 0 || finished) {
b.trimOutput()
fmt.Fprintf(b.w, "%s--- %s: %s\n%s", b.chatty.prefix(), tag, b.name, b.output)
}
@@ -304,28 +303,32 @@ func (b *B) launch() {
b.signal <- true
}()
- // Run the benchmark for at least the specified amount of time.
- if b.benchTime.n > 0 {
- // We already ran a single iteration in run1.
- // If -benchtime=1x was requested, use that result.
- // See https://golang.org/issue/32051.
- if b.benchTime.n > 1 {
- b.runN(b.benchTime.n)
- }
- } else {
- d := b.benchTime.d
- for n := int64(1); !b.failed && b.duration < d && n < 1e9; {
- last := n
- // Predict required iterations.
- goalns := d.Nanoseconds()
- prevIters := int64(b.N)
- prevns := b.duration.Nanoseconds()
- if prevns <= 0 {
- // Round up, to avoid div by zero.
- prevns = 1
+ // b.Loop does its own ramp-up logic so we just need to run it once.
+ // If b.loopN is non zero, it means b.Loop has already run.
+ if b.loopN == 0 {
+ // Run the benchmark for at least the specified amount of time.
+ if b.benchTime.n > 0 {
+ // We already ran a single iteration in run1.
+ // If -benchtime=1x was requested, use that result.
+ // See https://golang.org/issue/32051.
+ if b.benchTime.n > 1 {
+ b.runN(b.benchTime.n)
+ }
+ } else {
+ d := b.benchTime.d
+ for n := int64(1); !b.failed && b.duration < d && n < 1e9; {
+ last := n
+ // Predict required iterations.
+ goalns := d.Nanoseconds()
+ prevIters := int64(b.N)
+ prevns := b.duration.Nanoseconds()
+ if prevns <= 0 {
+ // Round up, to avoid div by zero.
+ prevns = 1
+ }
+ n = int64(predictN(goalns, prevIters, prevns, last))
+ b.runN(int(n))
}
- n = int64(predictN(goalns, prevIters, prevns, last))
- b.runN(int(n))
}
}
b.result = BenchmarkResult{b.N, b.duration, b.bytes, b.netAllocs, b.netBytes, b.extra}