Go version
go version go1.25.1 linux/amd64
Output of go env in your module/workspace:
AR='ar'
CC='gcc'
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_ENABLED='1'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
CXX='g++'
GCCGO='gccgo'
GO111MODULE=''
GOAMD64='v1'
GOARCH='amd64'
GOAUTH='netrc'
GOBIN=''
GOCACHE='/home/radu_cockroachlabs_com/.cache/go-build'
GOCACHEPROG=''
GODEBUG=''
GOENV='/home/radu_cockroachlabs_com/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFIPS140='off'
GOFLAGS=''
GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build4207328522=/tmp/go-build -gno-record-gcc-switches'
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMOD='/dev/null'
GOMODCACHE='/home/radu_cockroachlabs_com/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/home/radu_cockroachlabs_com/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/usr/local/go'
GOSUMDB='sum.golang.org'
GOTELEMETRY='local'
GOTELEMETRYDIR='/home/radu_cockroachlabs_com/.config/go/telemetry'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/local/go/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.25.1'
GOWORK=''
PKG_CONFIG='pkg-config'
What did you do?
I have a standard parallel benchmark:
func BenchmarkFoo(b *testing.B) {
// <some setup work>
b.ResetTimer()
b.RunParallel(func (pb *testing.PB) {
for pb.Next() {
// very small amount of work
}
}
}
I ran: `go test -run - -bench Foo --benchtime=30s -v .'
What did you see happen?
It does not complete, even after several minutes.
I added a log during the setup work that prints b.N. The verbose output is like this:
goos: linux
goarch: amd64
pkg: github.com/cockroachdb/pebble/internal/cache
cpu: Intel(R) Xeon(R) CPU @ 2.80GHz
BenchmarkCacheGet
cache_test.go:261: N: 1
cache_test.go:261: N: 69
cache_test.go:261: N: 4462
cache_test.go:261: N: 309830
cache_test.go:261: N: 20830386
cache_test.go:261: N: 521723665
cache_test.go:261: N: 521723666
cache_test.go:261: N: 521723667
cache_test.go:261: N: 521723668
cache_test.go:261: N: 521723669
cache_test.go:261: N: 521723670
cache_test.go:261: N: 521723671
cache_test.go:261: N: 521723672
cache_test.go:261: N: 521723673
cache_test.go:261: N: 521723674
cache_test.go:261: N: 521723675
cache_test.go:261: N: 521723676
cache_test.go:261: N: 521723677
cache_test.go:261: N: 521723678
cache_test.go:261: N: 521723679
cache_test.go:261: N: 521723680
cache_test.go:261: N: 521723681
cache_test.go:261: N: 521723682
...
Clearly there is something wrong with the algorithm that iterates toward finding the "right" N. Which, by the way, shouldn't even be necessary when using pb.Next() (it could in principle behave like b.Loop()).
The machine has 24 CPUs. I can't reproduce this on a different (smaller) machine.
What did you expect to see?
Expected this to take between 30-60s.
Comment From: RaduBerinde
The setup work is non-trivial (maybe around 1 second).
With --benchtime=10s, it works fine:
cache_test.go:261: N: 1
cache_test.go:261: N: 21
cache_test.go:261: N: 428
cache_test.go:261: N: 9556
cache_test.go:261: N: 198058
cache_test.go:261: N: 4414358
cache_test.go:261: N: 72615568
cache_test.go:261: N: 240240408
BenchmarkCacheGet-24 240240408 43.75 ns/op
Comment From: RaduBerinde
A simple catch-all would be to stop iterating if the change in b.N is less than say 0.1%
Comment From: mknyszek
CC @adonovan @neild
Comment From: gabyhelp
Related Issues
- testing: strange benchmark results with RunParallel and -benchtime #72079
- testing: benchmark iteration reports incorrectly #41637 (closed)
- testing: run first benchmark with last value from -cpu list GOMAXPROCS value #49980
- testing: Benchmark reporting incorrect stats when running in parallel #28813
- Running testing.Benchmark produces wrong number of iterations #40012 (closed)
- Benchmark results vastly different when Tests are skipped with -run=XXX #42696 (closed)
- expvar: BenchmarkRealworldExpvarUsage times out on specific arm64 server #47511 (closed)
- testing: high start up cost with high -count and no tests #49050 (closed)
- cmd/test2json: benchmark output lines are attributed to the preceding test #49505 (closed)
- cmd/go: use of -bench should force -p=1. #5662 (closed)
(Emoji vote if this was helpful or unhelpful; more detailed feedback welcome in this discussion.)