为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
jeck猫 2022-08-24 17:33:37
如果我想比较两个函数的时间,但函数花费的时间不到一纳秒,我该怎么办?t := time.Now()_ = fmt.Sprint("Hello, World!")d := time.Since(t)d.Round(0)fmt.Println(d.Nanoseconds()) // Prints 0我可以运行该函数几次,并将时间除以执行次数,但我宁愿使用一种方法来计算单个执行的时间。有没有办法做到这一点?
查看完整描述

2 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

如果函数的定时生成时间小于纳秒,则通常意味着代码已优化。

编译器可以检测到某些代码没有副作用,并决定“我为什么要这样做”。

1/(1 ns) 是 1 Ghz。现代台式计算机的上限约为 5 Ghz,给予或接受。因此,要使其小于1 ns,操作加上获取时间的开销必须少于5个CPU周期。在这种分辨率下,CPU不会一次做一件事。指令的开始和结束可以间隔多个周期,操作是流水线的。

因此,您必须查看机器代码并了解体系结构,以确定实际成本是多少,包括CPU资源的哪些部分被使用,以及它将如何与您可能想要在附近执行的其他操作发生冲突。

因此,在大多数CPU上,即使是“之前”和“之后”在低于1ns的时间分辨率下也不再具有合理的意义,其速度足以在1 Ghz以上运行。


查看完整回答
反对 回复 2022-08-24
?
GCT1015

TA贡献1827条经验 获得超4个赞

你可以做的是回答“在这个东西至少需要一纳秒之前运行多少次”的问题:


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)

}


查看完整回答
反对 回复 2022-08-24
  • 2 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号