go testing: Benchmark reporting incorrect stats when running in parallel

9njqaruj  于 5个月前  发布在  Go
关注(0)|答案(4)|浏览(176)

你正在使用的Go版本是什么( go version )?

$ go version
go version go1.11 linux/amd64

也适用于早期版本

这个问题在最新版本中是否重现?

是的

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build896591388=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

使用以下测试文件:

package bechmarkperf

import (
	"strconv"
	"testing"
	"time"
)

func BenchmarkSleepSerial(b *testing.B) {
	for i := 0; i < b.N; i++ {
		sleepFunc()
	}
}

func BenchmarkSleepParallel(b *testing.B) {
	for i := 1; i <= 8; i *= 2 {
		b.Run(strconv.Itoa(i), func(b *testing.B) {
			b.SetParallelism(i)
			b.RunParallel(func(pb *testing.PB) {
				for pb.Next() {
					sleepFunc()
				}
			})
		})
	}
}

func sleepFunc() {
	time.Sleep(1 * time.Millisecond)
}

并行运行,结果大约为 ns/op 的 1ms/次。这意味着将线程数加倍,ns/op 将减半。

你期望看到什么?

ns/op保持不变且不低于1ms。

你看到了什么?

当使用128个goroutine运行时,得到以下输出:

BenchmarkSleepParallel/8-16  	  100000	     12024 ns/op	       0 B/op	       0 allocs/op

这表明基准进程的执行时间远低于1ms(上面的睡眠时间)。

eimct9ow

eimct9ow1#

https://golang.org/cl/149720提到了这个问题:testing: correct benchmark output when running in parallel

8dtrkrch

8dtrkrch2#

你好,@mnewswanger。由于Go 1.13正在积极开发中,Ian在你的CL上留下了一些反馈。请查看一下。谢谢。

b0zn9rqh

b0zn9rqh3#

我已经回应了Ian的评论(关于添加一个测试用例来覆盖这个场景),并且我刚刚重置以解决与主分支的合并冲突。如果你需要其他任何东西,请告诉我。

u4vypkhs

u4vypkhs4#

在这一点上,我还需要提供其他信息吗?

相关问题