我正在玩围棋中的基准测试,我有一个简单的函数,它只会Hibernate 5纳秒,但当我运行基准测试时,它显示为298.1 ns/op.我很好奇为什么会这样.不是应该是5 ns/op吗?

GO版本:

go version go1.19 linux/amd64

代码:

package andrei

import (
    "testing"
    "time"
)

func Hi() {
    time.Sleep(5 * time.Nanosecond)
}

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

结果是:

$ go test -run none -bench  . -benchmem ./andrei

goos: linux
goarch: amd64
pkg: andrei/andrei
cpu: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz
BenchmarkHi-8            3861392               298.1 ns/op             0 B/op          0 allocs/op
PASS
ok      andrei/andrei   1.470s

推荐答案

time.Sleep only guarantees that it will sleep at least as long as the argument.它的实际Hibernate 时间取决于您的操作系统和其他因素.

在Windows上,它的睡眠时间至少为1.9毫秒.在我的Macbook上,我的速度是408 ns/op,而你看到的是298.1 ns/op.

您可以在Go GitHub存储库的此罚单中找到有关此问题的更多详细信息:

https://github.com/golang/go/issues/29485

Go相关问答推荐

消费者在NAT中是如何实现的

Go Net/http路由

正在使用terratest执行terraform脚本测试,但遇到错误退出状态1

使用GO从RDPMC获得价值

从使用Golang otelmux检测的Otel跟踪中获取trace_id

如何从 Go Lambda 函数返回 HTML?

有没有办法在 Golang 中使用带有 go-simple-mail lib 的代理?

尽管存在 WaitGroup,Goroutines 似乎被打断了

在本地 go 应用程序上获取秘密的正确策略

加密/椭圆:try 在无效点上进行操作

使用 Go 解组 SOAP 消息

不能使用 mockDB(*MockDB 类型的变量)作为 struct 文字中的 *gorm.DB 值

GqlGen - 在字段解析器中访问查询输入参数

如何将多个切片打印为一个切片?

使用 `didip/tollbooth` 限制每小时最大请求数

在 go 中将运行命令的标准输出发送到其标准输入

使用 Golang SQL 驱动程序连接到snowflake

将 Golang Gin 与 AWS Lambda 和无服务器与代理路径一起使用

如何在循环中旋转图像以便在 golang 中创建 GIF?

同一个 Go struct成员上的多个标签