如何解决如何在 Go 中计时,只需要不到一纳秒?
如果我想比较两个函数的时间,但这些函数花费的时间不到一纳秒,我该如何进行?
t := time.Now()
_ = fmt.Sprint("Hello,World!")
d := time.Since(t)
d.Round(0)
fmt.Println(d.Nanoseconds()) // Prints 0
我可以多次运行该函数并将时间除以执行次数,但我更喜欢一种对单次执行进行计时的方法。有没有办法做到这一点?
解决方法
如果计时函数生成的时间小于一纳秒,通常意味着代码已优化。
编译器可以检测到某些代码没有副作用,并决定“我为什么要这样做”。
1/(1 ns) 是 1 GHz。现代台式计算机的上限约为 5 Ghz,无论给予或接受。因此,要使其小于 1 ns,操作加上获取时间的开销必须少于 5 个 CPU 周期。在该级别的分辨率下,CPU 一次不会做一件事。指令的开始和结束可以相隔多个周期,操作是流水线式的。
因此,您必须查看机器代码并了解架构,以确定真正的成本是多少,包括使用了 CPU 资源的哪些部分,以及它会如何与您可能想要在附近执行的其他操作发生冲突。
因此,即使“之前”和“之后”在大多数 CPU 上以低于 1 ns 的时间分辨率也不再具有合理的意义,其速度足以在 1 Ghz 以上运行。
,你可以做的就是回答这个问题“在这件事之前运行了多少次 至少需要一纳秒”:
package main
import (
"fmt"
"time"
)
func main() {
d := 1
for {
t := time.Now()
for e := d; e > 0; e-- {
fmt.Sprint("Hello,World!")
}
if time.Since(t) > 0 { break }
d *= 2
}
println(d)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。