如何在围棋中计时,这需要不到一纳秒的时间?

如果我想比较两个函数的时间,但函数花费的时间不到一纳秒,我该怎么办?


t := time.Now()

_ = fmt.Sprint("Hello, World!")

d := time.Since(t)

d.Round(0)

fmt.Println(d.Nanoseconds()) // Prints 0

我可以运行该函数几次,并将时间除以执行次数,但我宁愿使用一种方法来计算单个执行的时间。有没有办法做到这一点?


jeck猫
浏览 95回答 2
2回答

慕尼黑5688855

如果函数的定时生成时间小于纳秒,则通常意味着代码已优化。编译器可以检测到某些代码没有副作用,并决定“我为什么要这样做”。1/(1 ns) 是 1 Ghz。现代台式计算机的上限约为 5 Ghz,给予或接受。因此,要使其小于1 ns,操作加上获取时间的开销必须少于5个CPU周期。在这种分辨率下,CPU不会一次做一件事。指令的开始和结束可以间隔多个周期,操作是流水线的。因此,您必须查看机器代码并了解体系结构,以确定实际成本是多少,包括CPU资源的哪些部分被使用,以及它将如何与您可能想要在附近执行的其他操作发生冲突。因此,在大多数CPU上,即使是“之前”和“之后”在低于1ns的时间分辨率下也不再具有合理的意义,其速度足以在1 Ghz以上运行。

GCT1015

你可以做的是回答“在这个东西至少需要一纳秒之前运行多少次”的问题:package mainimport (   "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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go