登录
首页 >  Golang >  Go问答

如何在 Go 中测量极短时间间隔?

来源:stackoverflow

时间:2024-02-22 08:09:25 127浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《如何在 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 资源的哪些部分,以及它如何与您可能想要在附近执行的其他操作发生冲突。

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

您可以做的就是回答问题“在这件事之前运行了多少次 至少需要一纳秒”:

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)
}

理论要掌握,实操不能落!以上关于《如何在 Go 中测量极短时间间隔?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>