你正在使用的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(上面的睡眠时间)。
4条答案
按热度按时间eimct9ow1#
https://golang.org/cl/149720提到了这个问题:
testing: correct benchmark output when running in parallel
8dtrkrch2#
你好,@mnewswanger。由于Go 1.13正在积极开发中,Ian在你的CL上留下了一些反馈。请查看一下。谢谢。
b0zn9rqh3#
我已经回应了Ian的评论(关于添加一个测试用例来覆盖这个场景),并且我刚刚重置以解决与主分支的合并冲突。如果你需要其他任何东西,请告诉我。
u4vypkhs4#
在这一点上,我还需要提供其他信息吗?