Go 使用 defer 计算函数耗时为什么总是很少?

Go语言精选

共 1350字,需浏览 3分钟

 ·

2020-08-24 07:53

点击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习 Go 语言

这是一个新手问题,可能很容易忽略。

今天想计算程序的耗时时间,为了方便使用defer来计算函数的总的执行时间。但是耗时总是很少。后来经过如下实验发下了问题:

logsParam := "[test]"
startTime := time.Now()
defer logs.Warning("%s end-cost Seconds:%vs ", logsParam, time.Since(startTime).Seconds())
time.Sleep(2 * time.Second)

logs.Warning("%s end-cost-2 Seconds:%vs ", logsParam, time.Since(startTime).Seconds())

输出:

2020/08/21 14:55:45.888 [W] [proc.go:203]  [test] end-cost-2 Seconds:2.000612215s 
2020/08/21 14:55:45.888 [W] [proc.go:203]  [test] end-cost Seconds:1.45e-07s 

使用以上的defer形式来计算耗时确实有问题。后来找到原因了:defer 调用的函数参数的值 defer 被定义时就确定了。所以耗时参数在defer定义的那块就确定了,所以耗时就很少了。计算耗时的方法可以改成这样:

logsParam := "[test]"
startTime := time.Now()
defer func(time1 time.Time) {
    logs.Warning("%s end-cost Seconds:%v\n", logsParam, time.Since(time1))
}(startTime)
time.Sleep(2 * time.Second)

logs.Warning("%s end-cost-2 Seconds:%vs ", logsParam, time.Since(startTime).Seconds())

输出:

2020/08/21 15:27:31.594 [W] [proc.go:203]  [test] end-cost-2 Seconds:2.000604603s 
2020/08/21 15:27:31.594 [W] [main.go:58]  [test] end-cost Seconds:2.000729234s

圆满完成~~~

原文作者:TTWP_8

原文链接:https://www.jianshu.com/p/d3b7eac81679



推荐阅读


学习交流 Go 语言,扫码回复「进群」即可


站长 polarisxu

自己的原创文章

不限于 Go 技术

职场和创业经验


Go语言中文网

每天为你

分享 Go 知识

Go爱好者值得关注


浏览 18
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报