Benchmark 函数名称后的“-6”是什么意思?

Saq*_*Ali 3 benchmarking go

我有一个 go test 文件,我在其中编写了一个基准函数,如下所示:

func BenchmarkStuff(b *testing.B) {
    for i := 0; i < b.N; i++ {
        stuff()
    }
}
Run Code Online (Sandbox Code Playgroud)

当我用 运行它时go test -benchtime 1x,我得到了这个:

BenchmarkStuff-6               1     847751900 ns/op
Run Code Online (Sandbox Code Playgroud)

这是什么-6意思?这似乎不必要地神秘。

col*_*tor 9

它表示用于运行基准测试的 CPU 数量 - 所以在您的情况下6


编辑

基准名称格式似乎没有正式记录在 Go 网站上,但您可以在标准库源中看到名称是如何在此处此处制定的:

runtime.GOMAXPROCS(procs)
benchName := benchmarkName(b.name, procs)

func benchmarkName(name string, n int) string {
    if n != 1 {
        return fmt.Sprintf("%s-%d", name, n)
    }
    return name
}
Run Code Online (Sandbox Code Playgroud)

仅供参考:来自go help命令行文档:

go help testflag
Run Code Online (Sandbox Code Playgroud)
    -cpu 1,2,4
        Specify a list of GOMAXPROCS values for which the tests or
        benchmarks should be executed. The default is the current value
        of GOMAXPROCS.
Run Code Online (Sandbox Code Playgroud)

因此,如果您想强制您的基准测试使用较少数量的 CPU,请使用 env var GOMAXPROCS

$ GOMAXPROCS=2  go test -bench=.

...

BenchmarkStuff-2    1000000000           0.2642 ns/op
Run Code Online (Sandbox Code Playgroud)

或者您可以对多个 CPU 内核设置进行基准测试,如下所示:

$ go test -bench=. -cpu=1,2,4

...

BenchmarkStuff      1000000000           0.2516 ns/op
BenchmarkStuff-2    1000000000           0.2531 ns/op
BenchmarkStuff-4    1000000000           0.2488 ns/op
Run Code Online (Sandbox Code Playgroud)

  • 它在标准库源中“记录”:) 请参阅更新。 (2认同)