猿问

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

我想到了使用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.go

Processed 209806/209806 TUF files

All records are inserted in the database.

Verifying records are inserted correctly...

Verified 209806/209806 TUF files

All records have been inserted and verified successfully.

The process took 600ns

[14:24:06]pc@work:~/test$

尽管该过程耗时 5 小时(从左侧的时间戳可以看出),但延迟fmt.Println()语句显示为 600 纳秒。我究竟做错了什么?


绝地无双
浏览 125回答 2
2回答

心有法竹

延迟函数参数会立即求值。您可以将他们的评估包装到一个匿名函数中以延迟他们的评估,直到延迟实际被触发:defer func() {     fmt.Println(fmt.Sprintf("The process took %s", time.Now().Sub(start))) }()在Go 之旅和语言规范中阅读有关 defer 语句的更多信息。

九州编程

defer立即评估红色函数的参数,这意味着该time.Now().Sub(start)部分在开始后立即计算。如果你想为函数计时,说:defer func() {     time.Now().Sub(start) // ...     }()或者,我已经为它写了一个包:https ://github.com/gonutz/tic所以你可以说:func main() {     defer tic.Toc()() }并注意()()出于完全相同的原因而存在的两个函数,第一个函数调用启动计时并返回一个要延迟的函数,该函数停止计时。
随时随地看视频慕课网APP

相关分类

Go
我要回答