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

在 Go 中使用 defer 语句测量经过的时间

在 Go 中使用 defer 语句测量经过的时间

Go
绝地无双 2023-01-03 14:09:33
我想到了使用defer语句来测量 Go 中程序的运行时间:func main() {    start := time.Now()    defer fmt.Println(fmt.Sprintf("The process took %s", time.Now().Sub(start)))    ...}我认为这会产生正确的结果,但事实并非如此:[09:36:55]pc@work:~/test$ go run ./main.goProcessed 209806/209806 TUF filesAll records are inserted in the database.Verifying records are inserted correctly...Verified 209806/209806 TUF filesAll records have been inserted and verified successfully.The process took 600ns[14:24:06]pc@work:~/test$尽管该过程耗时 5 小时(从左侧的时间戳可以看出),但延迟fmt.Println()语句显示为 600 纳秒。我究竟做错了什么?
查看完整描述

2 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

延迟函数参数会立即求值。您可以将他们的评估包装到一个匿名函数中以延迟他们的评估,直到延迟实际被触发:

defer func() {
    fmt.Println(fmt.Sprintf("The process took %s", time.Now().Sub(start)))
}()

在Go 之旅语言规范中阅读有关 defer 语句的更多信息。



查看完整回答
反对 回复 2023-01-03
?
九州编程

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

defer立即评估红色函数的参数,这意味着该time.Now().Sub(start)部分在开始后立即计算。

如果你想为函数计时,说:

defer func() {
    time.Now().Sub(start) // ...
    }()

或者,我已经为它写了一个包:https ://github.com/gonutz/tic所以你可以说:

func main() { 
   defer tic.Toc()()
}

并注意()()出于完全相同的原因而存在的两个函数,第一个函数调用启动计时并返回一个要延迟的函数,该函数停止计时。


查看完整回答
反对 回复 2023-01-03
  • 2 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信