aboutsummaryrefslogtreecommitdiff
path: root/src/testing
diff options
context:
space:
mode:
authorAlberto Donizetti <alb.donizetti@gmail.com>2018-05-31 12:04:07 +0000
committerAlberto Donizetti <alb.donizetti@gmail.com>2018-05-31 14:22:44 +0000
commitbfdf74be12e2527d797968870564e8dafc2aacb5 (patch)
treeeeb9c9e308d2622f4e8323f93439a808bd7ece3b /src/testing
parentcaf968616a3ee09d6c820428b4edebb68cfbde09 (diff)
downloadgo-bfdf74be12e2527d797968870564e8dafc2aacb5.tar.xz
Revert "testing: only compute b.N once when passed -count > 1"
This reverts golang.org/cl/110775 Reason for revert: this is causing huge slow-dows on every run after the 1st, on various benchmarks, on multiple architectures (see Issue 25622 for details). It's just a nice-to-have little optimization, and we're near the 1st go1.11 beta release, so I'm reverting it. Fixes #25622 Change-Id: I758ade4af4abf764abd8336d404396992d11a0c6 Reviewed-on: https://go-review.googlesource.com/115535 Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
Diffstat (limited to 'src/testing')
-rw-r--r--src/testing/benchmark.go47
1 files changed, 15 insertions, 32 deletions
diff --git a/src/testing/benchmark.go b/src/testing/benchmark.go
index bef1492cd6..9c7b1be79e 100644
--- a/src/testing/benchmark.go
+++ b/src/testing/benchmark.go
@@ -251,20 +251,27 @@ func (b *B) run() {
b.context.processBench(b) // Must call doBench.
} else {
// Running func Benchmark.
- b.doBench(0)
+ b.doBench()
}
}
-func (b *B) doBench(hint int) BenchmarkResult {
- go b.launch(hint)
+func (b *B) doBench() BenchmarkResult {
+ go b.launch()
<-b.signal
return b.result
}
-// autodetectN runs the benchmark function, gradually increasing the
-// number of iterations until the benchmark runs for the requested
-// benchtime.
-func (b *B) autodetectN() {
+// launch launches the benchmark function. It gradually increases the number
+// of benchmark iterations until the benchmark runs for the requested benchtime.
+// launch is run by the doBench function as a separate goroutine.
+// run1 must have been called on b.
+func (b *B) launch() {
+ // Signal that we're done whether we return normally
+ // or by FailNow's runtime.Goexit.
+ defer func() {
+ b.signal <- true
+ }()
+
// Run the benchmark for at least the specified amount of time.
d := b.benchTime
for n := 1; !b.failed && b.duration < d && n < 1e9; {
@@ -282,26 +289,6 @@ func (b *B) autodetectN() {
n = roundUp(n)
b.runN(n)
}
-}
-
-// launch launches the benchmark function for hintN iterations. If
-// hintN == 0, it autodetects the number of benchmark iterations based
-// on the requested benchtime.
-// launch is run by the doBench function as a separate goroutine.
-// run1 must have been called on b.
-func (b *B) launch(hintN int) {
- // Signal that we're done whether we return normally
- // or by FailNow's runtime.Goexit.
- defer func() {
- b.signal <- true
- }()
-
- if hintN == 0 {
- b.autodetectN()
- } else {
- b.runN(hintN)
- }
-
b.result = BenchmarkResult{b.N, b.duration, b.bytes, b.netAllocs, b.netBytes}
}
@@ -439,7 +426,6 @@ func runBenchmarks(importPath string, matchString func(pat, str string) (bool, e
// processBench runs bench b for the configured CPU counts and prints the results.
func (ctx *benchContext) processBench(b *B) {
for i, procs := range cpuList {
- var nHint int
for j := uint(0); j < *count; j++ {
runtime.GOMAXPROCS(procs)
benchName := benchmarkName(b.name, procs)
@@ -458,10 +444,7 @@ func (ctx *benchContext) processBench(b *B) {
}
b.run1()
}
- r := b.doBench(nHint)
- if j == 0 {
- nHint = b.N
- }
+ r := b.doBench()
if b.failed {
// The output could be very long here, but probably isn't.
// We print it all, regardless, because we don't want to trim the reason