You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Benchmarks running with 'RunParallel' calculates the 'grain' value based on the previous iteration number and previous duration, while the value might be fuzzy if -benchtime=Nx is specified since the auto adjustment phase is skipped and the previous iteration number is always 1, resulting in a much smaller 'grain' (most of time it's 1) than normal flow.
example 1:
// normal flow
$ go test -run=none -bench=BenchmarkChanNonblocking -count=5 runtime
BenchmarkChanNonblocking-40 1000000000 0.570 ns/op
BenchmarkChanNonblocking-40 1000000000 0.386 ns/op
BenchmarkChanNonblocking-40 1000000000 0.396 ns/op
BenchmarkChanNonblocking-40 1000000000 0.374 ns/op
BenchmarkChanNonblocking-40 1000000000 0.383 ns/op
// running with -benchtime=1000000000x delivers
$ go test -run=none -bench=BenchmarkChanNonblocking -count=5 -benchtime=1000000000x runtime
BenchmarkChanNonblocking-40 1000000000 23.6 ns/op
BenchmarkChanNonblocking-40 1000000000 22.5 ns/op
BenchmarkChanNonblocking-40 1000000000 22.0 ns/op
BenchmarkChanNonblocking-40 1000000000 22.1 ns/op
BenchmarkChanNonblocking-40 1000000000 22.5 ns/op
example 2:
$ go test -run=none -bench=BenchmarkMatchParallelShared -count=5 regexp
BenchmarkMatchParallelShared-40 77046073 14.4 ns/op
....
$ go test -run=none -bench=BenchmarkMatchParallelShared -count=5 -benchtime=77046073x regexp
BenchmarkMatchParallelShared-40 77046073 75.9 ns/op
....
Propose to calculate 'grain' by "b.benchTime.n / numProcs" first if -benchtime=Nx is specified, then continue with the current rounding up.
diff --git a/src/testing/benchmark.go b/src/testing/benchmark.go
index 88ba0f0242..d35764b3b9 100644
--- a/src/testing/benchmark.go
+++ b/src/testing/benchmark.go
@@ -735,8 +735,11 @@ func (b *B) RunParallel(body func(*PB)) {
// Calculate grain size as number of iterations that take ~100<C2><B5>s.
// 100<C2><B5>s is enough to amortize the overhead and provide sufficient
// dynamic load balancing.
+ numProcs := b.parallelism * runtime.GOMAXPROCS(0)
grain := uint64(0)
- if b.previousN > 0 && b.previousDuration > 0 {
+ if b.benchTime.n > 0 {
+ grain = uint64(b.benchTime.n / numProcs)
+ } else if b.previousN > 0 && b.previousDuration > 0 {
grain = 1e5 * uint64(b.previousN) / uint64(b.previousDuration)
}
if grain < 1 {
@@ -749,7 +752,6 @@ func (b *B) RunParallel(body func(*PB)) {
}
n := uint64(0)
- numProcs := b.parallelism * runtime.GOMAXPROCS(0)
Benchmarks running with 'RunParallel' calculates the 'grain' value based on the previous iteration number and previous duration, while the value might be fuzzy if -benchtime=Nx is specified since the auto adjustment phase is skipped and the previous iteration number is always 1, resulting in a much smaller 'grain' (most of time it's 1) than normal flow.
Propose to calculate 'grain' by "b.benchTime.n / numProcs" first if -benchtime=Nx is specified, then continue with the current rounding up.
New output with the above change:
The text was updated successfully, but these errors were encountered: